MSSQL select where following (sequence) rows with the same column value as current column equale to X

时间:2019-01-07 13:42:17

标签: sql-server

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

1 个答案:

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