【发布时间】:2014-03-14 10:00:47
【问题描述】:
我需要根据“级联 if 条件”集从每组项目中选择“前 1”记录。
分组基于 MovieId、Formatid 和 Date。
这是我的表格的一个例子(为了突出显示我试图实现的逻辑的 4 个“案例”)...
Id | MovieId | FormatId | SourceId | Date | Lock | Created | Modified
------------------------------------------------------------------------------
1 | 1 | 1 | 1 | 2014-03-12 | 1 | 2014-03-12 | NULL
2 | 1 | 1 | 2 | 2014-03-12 | NULL | 2014-03-12 | NULL
3 | 1 | 1 | 3 | 2014-03-12 | NULL | 2014-03-12 | 2014-03-13
4 | 1 | 1 | 4 | 2014-03-12 | NULL | 2014-03-12 | NULL
5 | 1 | 2 | 1 | 2014-03-12 | NULL | 2014-03-12 | NULL
6 | 1 | 2 | 2 | 2014-03-12 | NULL | 2014-03-12 | NULL
7 | 1 | 2 | 3 | 2014-03-12 | NULL | 2014-03-12 | NULL
8 | 1 | 2 | 4 | 2014-03-12 | NULL | 2014-03-12 | NULL
9 | 1 | 3 | 1 | 2014-03-12 | NULL | 2014-03-12 | NULL
10 | 1 | 3 | 3 | 2014-03-12 | NULL | 2014-03-12 | 2014-03-13
11 | 2 | 1 | 2 | 2014-03-12 | NULL | 2014-03-12 | NULL
我的预期结果将是这些行...
1 | 1 | 1 | 1 | 2014-03-12 | 1 | 2014-03-12 | NULL
8 | 1 | 2 | 4 | 2014-03-12 | NULL | 2014-03-12 | NULL
10 | 1 | 3 | 3 | 2014-03-12 | NULL | 2014-03-12 | 2014-03-13
11 | 2 | 1 | 2 | 2014-03-12 | NULL | 2014-03-12 | NULL
这是算法(同样,每个 MovieId/FormatId/Date 组)...
首先,如果有一条 SourceId = 1 AND Lock NOT NULL 的记录,则选择该记录。
其次,如果有 SourceId = 4 的记录,则选择那个。
三、如果有SourceId 2的记录,则选择最近更新的记录。
最后,如果只有 1 条记录 SourceId = 2,则选择那条记录。
另外两个注释/请求... 1) 我已经有一个索引视图来执行其中的一些操作并使用带有 ROW_NUMBER() 的“条件 ORDER BY”子句,即
ORDER BY (CASE WHEN X THEN A END) DESC, (CASE WHEN Y THEN B END)...
但这并不完全正确,而且表现很糟糕! 2) 这个表非常大(目前大约有 600 万行),所以我看到的一些东西推荐适用于 small'ish 表,但这个表不是其中之一。
提前致谢! --亨利
【问题讨论】:
标签: sql sql-server tsql