如何从此表中正确提取记录?

时间:2012-09-26 08:17:15

标签: c# .net algorithm tsql linq-to-sql

我有一个带 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      |

2 个答案:

答案 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);