我有一个带 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_id , date_from , date_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 |
答案 0 :(得分: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
答案 1 :(得分: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);