how do i do a select where count = select all sequence rows has the same column value as current column value only if there 3 in sequence (row after row with no holes)
NAME | NUM | DATE
---------------------------------
Name 1 | 1 | '2019-01-07 12:11:11:001'
Name 2 | 1 | '2019-01-07 12:11:12:002'
Name 3 | 3 | '2019-01-07 12:11:13:003'
Name 4 | 2 | '2019-01-07 12:11:14:004'
Name 5 | 2 | '2019-01-07 12:11:15:005'
Name 6 | 2 | '2019-01-07 12:11:16:006'
Name 7 | 4 | '2019-01-07 12:11:17:007'
Name 8 | 5 | '2019-01-07 12:11:18:008'
The results should be where count sequence=3
NAME | NUM | DATE
---------------------------------
Name 4 | 2 | '2019-01-07 12:11:14:004'
Name 5 | 2 | '2019-01-07 12:11:15:005'
Name 6 | 2 | '2019-01-07 12:11:16:006'
because 2 appears 3 times in sequence
答案 0 :(得分:1)
您可以使用以下查询:
SELECT [NAME], [NUM], [DATE],
ROW_NUMBER() OVER (ORDER BY [DATE]) -
ROW_NUMBER() OVER (PARTITION BY NUM ORDER BY [DATE]) AS grp
FROM mytable
获得:
NAME NUM DATE grp
----------------------------------------
Name 1 1 2019-01-07 12:11:11 0
Name 2 1 2019-01-07 12:11:12 0
Name 4 2 2019-01-07 12:11:13 3
Name 5 2 2019-01-07 12:11:14 3
Name 6 2 2019-01-07 12:11:15 3
Name 3 3 2019-01-07 12:11:16 2
Name 7 4 2019-01-07 12:11:17 6
Name 8 5 2019-01-07 12:11:18 7
如您所见,可以使用计算列grp
来识别具有 same NUM
值的连续记录的孤岛。
然后您可以将以上查询包装在CTE
中,然后执行以下操作:
;WITH GroupCTE AS (
SELECT [NAME], [NUM], [DATE],
ROW_NUMBER() OVER (ORDER BY [DATE]) -
ROW_NUMBER() OVER (PARTITION BY NUM ORDER BY [DATE]) AS grp
FROM mytable
)
SELECT t.*
FROM GroupCTE AS t
JOIN (SELECT NUM, grp
FROM GroupCTE
GROUP BY NUM, grp
HAVING COUNT(*) = 3) AS g ON t.NUM = g.NUM AND t.grp = g.grp