0

DATEフィールドを持つ連想テーブルがあります。

|       DATE          |  USER_ID  | GROUP_ID   |
| 2012-09-20 00:00:00 |     7     |     1      |
| 2012-09-20 00:00:00 |     6     |     1      |
| 2012-09-13 00:00:00 |     5     |     1      |
| 2012-09-10 00:00:00 |     1     |     1      |
| 2012-09-02 00:00:00 |     5     |     3      |
| 2012-08-02 00:00:00 |     5     |     2      |
| 2012-07-01 00:00:00 |     5     |     1      |
| 2012-07-01 00:00:00 |     3     |     1      |

各レコードは、ユーザーとグループの間の関連付けを表します。各関連付けは、表に示されている日付から有効であり、新しい関連付けが表に挿入されるまで一定のままです。

特定の日付のユーザーとグループの関連付けを知るのは非常に簡単です。表示された日付よりも小さい最大の日付を選択するだけです。

しかし今、特定のグループに関連付けられているすべてのユーザーを日付の範囲で抽出する必要があります。提供されるパラメーターは、 group_iddate_fromdate_toです。

これを Linq で実装する必要がありますが、T-SQL を使用して手順をテストしようとしています。

それが私が試したことです:

SELECT *
FROM user_group
where group_id = 1
and '2012-09-11' <= date
and date <= '2012-09-20'
UNION
SELECT TOP 1 *
FROM user_group
where group_id = 1
and date <= '2012-09-11'
order by date desc

しかし、明らかにそれは機能しません...

ノート:

主な問題は、from_dateより前に作成された関連付けを取得することですが、まだ有効であることです。明確にするために、次の結果を取得する必要があります。

|       DATE          |  USER_ID  | GROUP_ID   |
| 2012-09-20 00:00:00 |     7     |     1      |
| 2012-09-20 00:00:00 |     6     |     1      |
| 2012-09-13 00:00:00 |     5     |     1      |
| 2012-09-10 00:00:00 |     1     |     1      |
| 2012-07-01 00:00:00 |     3     |     1      |
4

2 に答える 2

0

select * from user_group where group_id=1 and date<=convert(date,'2012-09-20',120)
except
select * from user_group where group_id=1 and date<=convert(date,'2012-09-11',120)

それともこれ...

select date, user_id, group_id
from
(
    select *, ROW_NUMBER() over (partition by user_id order by date desc) rn 
    from user_group
    where date<=convert(date,'2012-09-20',120)
) v
where rn=1
and group_id=1    
order by date desc
于 2012-09-26T08:19:38.453 に答える
0

最後に、私のために働くこの解決策を見つけました:

var innerAssoc = from assoc in user_group
                 where assoc.group_id == group_id
                 && dateFrom.Date <= assoc.date.Date
                 && date.Date <= dateTo.Date
                 select assoc;

var outerAssoc = from assoc in user_group
                 where assoc.group_id == group_id
                 && assoc.date.Date == user_group
                 .Where(a => a.user_id == assoc.user_id && a.date.Date <= dateFrom.Date)
                 .Select(a => a.date.Date).Max()
                 select assoc;

var res = innerAssoc.Union(outerAssoc);
于 2012-09-26T09:40:58.497 に答える