我在此网站上遇到了许多问题,但找不到解决方案。
我有一张 table :
日期GroupID channel
2015年2月24日1 A
2015年2月26日1 B
2015年2月27日1 C
2015年3月21日2天
2015年2月20日3 E
25/02/2015 3天
2015年2月28日4 C
2015年4月3日5 B
2015年5月3日5 E
10/03/2015 5天
2015年11月3日5 A
2015年3月14日5 C
2015年3月23日5 F
2015年3月28日6 E

channel 限制为“A”,“B”,“C”,“D”,“E”,“F”。其中有很多行具有不同的GROUPID。

我需要得到这张 table :
日期组ID channel 是第一组是最后一组之前的最后一个 channel
24/02/2015 1真假3 3
26/02/2015 1 B假假3 1
27/02/2015 1 C否是3 0
21/03/2015 2 D是是1 0
20/02/2015 3真是假2 5
25/02/2015 3 D假假2 0
28/02/2015 4 C是是1 0
2015年4月3日5 B是否是6 19
2015年5月3日5 E假假6 18
10/03/2015 5 D假假6 13
11/03/2015 5假假6 12
14/03/2015 5 C假假6 9
23/03/2015 5 F假假6 0
28/03/2015 6 E是是1 0

当Channel是按时间排序的具有相同ID的行组中的第一个时,为IsFirst = TRUE;否则为FALSE。

当Channel是按时间排序的具有相同GroupID的行组中的最后一个时的IsLast = TRUE;否则为FALSE。
Channelsingroup-同一组(具有相同GroupID)中的行数
Daysbeforelast-该组中的最新行与当前行之间的日期差异(以天为单位)。

我无权创建或更新表,只能选择。

希望以上数据有意义,如有任何疑问,请告诉我。

最佳答案

一种解决方案是使用窗口聚合函数:

select
    *,
    case when date = MIN(date) over (partition by groupid order by groupid) then 'TRUE' else 'FALSE' end isFirst,
    case when date = MAX(date) over (partition by groupid order by groupid) then 'TRUE' else 'FALSE' end isLast,
    count(*) over (partition by groupid order by groupid) Channelsingroup,
    datediff(day,date,MAX(date) over (partition by groupid order by groupid)) Daysbeforelast
from your_table

Sample SQL Fiddle

关于sql - 根据组顺序选择新列,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30433024/

10-16 00:21