Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
TSQL-获取按行号分组的数据_Sql_Sql Server_Tsql - Fatal编程技术网

TSQL-获取按行号分组的数据

TSQL-获取按行号分组的数据,sql,sql-server,tsql,Sql,Sql Server,Tsql,我有一个带有ID和日期字段的表 ID |Date 1 |2013-5-22 1 |2013-5-23 1 |2013-5-25 1 |2013-5-26 2 |2013-5-26 2 |2013-5-27 1 |2013-5-27 1 |2013-5-28 使用行号,我可以按id对所有数据进行分组,并设置最小日期和最大日期 ;WITH q AS( SELECT f.*, grp = DATEDIFF(day

我有一个带有ID和日期字段的表

ID     |Date
1      |2013-5-22
1      |2013-5-23
1      |2013-5-25
1      |2013-5-26
2      |2013-5-26
2      |2013-5-27
1      |2013-5-27
1      |2013-5-28
使用行号,我可以按id对所有数据进行分组,并设置最小日期和最大日期

;WITH q AS(
SELECT f.*,
grp = DATEDIFF(day, 0, f.Date) - ROW_NUMBER() OVER (PARTITION BY f.ID ORDER BY f.Date),
FROM  myTable f    
)
SELECT 
MIN(q.ID) as ID,
MIN(q.Date) as StartDate,
MAX(q.Date) as EndDate
FROM q
GROUP BY q.grp, q.ID, Date
;
结果:

ID     |StartDate |EndDate
1      |2013-5-22 |2013-5-23
2      |2013-5-26 |2013-5-27
1      |2013-5-25 |2013-5-28

现在我需要一步一步地获取日期我的第一次尝试出现错误,请尝试以下方法:

;WITH q AS(
  SELECT ID, Date,
  grp = DATEDIFF(day, 0, Date) - ROW_NUMBER() OVER (PARTITION BY ID ORDER BY Date)
FROM  myTable
), r as
(
  select id, date, grp, 
  (ROW_NUMBER() OVER (PARTITION BY grp ORDER BY Date)-1)/3 a from q
)
SELECT 
MIN(ID) as ID,
MIN(Date) as StartDate,
MAX(Date) as EndDate
FROM r
GROUP BY grp, ID, a

您的查询不起作用,因为行号列后面有逗号。但即便如此,它也会返回一个不同的结果。
;WITH q AS(
SELECT  f.*,
grp = DATEDIFF(day, 0, f.Date) - ROW_NUMBER() OVER (PARTITION BY f.ID ORDER BY f.Date)
FROM  MyTable f
)
SELECT 
MIN(q.ID) as ID,
MIN(q.Date) as StartDate,
MAX(q.Date) as EndDate
FROM q
GROUP BY q.grp, q.ID
;
;WITH q AS(
  SELECT ID, Date,
  grp = DATEDIFF(day, 0, Date) - ROW_NUMBER() OVER (PARTITION BY ID ORDER BY Date)
FROM  myTable
), r as
(
  select id, date, grp, 
  (ROW_NUMBER() OVER (PARTITION BY grp ORDER BY Date)-1)/3 a from q
)
SELECT 
MIN(ID) as ID,
MIN(Date) as StartDate,
MAX(Date) as EndDate
FROM r
GROUP BY grp, ID, a