SQL - 我如何分组序列号和 return 最小和最大日期
SQL - How can I Group sets of sequential numbers and return the MIN and Max Dates
这让我发疯!有谁知道如何写一些 SQL 来 return 来自序列号组的 MIN 和 MAX 日期?请参阅下面的屏幕截图。
这是我用的SQL:
SELECT
num
, empid
, orderdate
FROM
(SELECT
ROW_NUMBER() OVER (ORDER BY orderdate) AS Num
, empid
, orderdate
FROM TSQL.Sales.Orders)T1
WHERE empid = 4
就是这样 returns:
我想做的是根据 num 列获取每组序列号的最小和最大日期。 例如: 第一组是数字 3、4、5 和 6。所以最小日期是 2006-07-08,最大日期是 2006-07-10
请参阅下面所需的结果示例
如有任何帮助,我们将不胜感激,提前致谢
更新
我现在已经更改了 SQL 来做我需要的:示例如下:
Select
empid
, Island
, MIN(orderdate) as 'From'
, Max(orderdate) as 'To'
From
(select
empid
, num
, num - ROW_NUMBER() OVER (ORDER BY num, orderdate) as Island
, orderdate
from
(Select
ROW_NUMBER() OVER (ORDER BY orderdate) as Num
, empid
, orderdate
from TSQL.Sales.Orders)T1
where empid = 4
)T2
group By
empid
, Island
结果
非常感谢你在这方面的帮助,我已经尝试了很久
此致
贾森
应该这样做:
;with dateSequences(num, empId, orderDate) as
(
select ROW_NUMBER() over (order by orderdate) as num
, empId
, orderdate
from yourTable
),
dateGroups(groupNum, empId, orderDate, num) as
(
select currD.num, currD.empid, currD.orderDate, currD.num
from dateSequences currD
left join dateSequences prevD on prevD.num = currD.num - 1 and prevD.empid = currD.empId
where prevD.num is null
union all
select dg.groupNum, d.empId, d.orderDate, d.num
from dateSequences d
inner join dateGroups dg on dg.num + 1 = d.num and d.empId = dg.empId
)
select empId, min(orderDate) as MinDate, max(orderDate) as MaxDate
from dateGroups
where empId = 4
group by empId, groupNum
基本上它首先创建一个 CTE 以按日期顺序获取每一行的行号。然后它进行递归 CTE,首先找到所有没有先前顺序条目的组,然后将所有后续条目添加到同一组。最后,它获取分配了所有组号的记录,并按组号对它们进行分组,并获取最小和最大日期。
这让我发疯!有谁知道如何写一些 SQL 来 return 来自序列号组的 MIN 和 MAX 日期?请参阅下面的屏幕截图。
这是我用的SQL:
SELECT
num
, empid
, orderdate
FROM
(SELECT
ROW_NUMBER() OVER (ORDER BY orderdate) AS Num
, empid
, orderdate
FROM TSQL.Sales.Orders)T1
WHERE empid = 4
就是这样 returns:
我想做的是根据 num 列获取每组序列号的最小和最大日期。 例如: 第一组是数字 3、4、5 和 6。所以最小日期是 2006-07-08,最大日期是 2006-07-10
请参阅下面所需的结果示例
如有任何帮助,我们将不胜感激,提前致谢
更新
我现在已经更改了 SQL 来做我需要的:示例如下:
Select
empid
, Island
, MIN(orderdate) as 'From'
, Max(orderdate) as 'To'
From
(select
empid
, num
, num - ROW_NUMBER() OVER (ORDER BY num, orderdate) as Island
, orderdate
from
(Select
ROW_NUMBER() OVER (ORDER BY orderdate) as Num
, empid
, orderdate
from TSQL.Sales.Orders)T1
where empid = 4
)T2
group By
empid
, Island
结果
非常感谢你在这方面的帮助,我已经尝试了很久
此致
贾森
应该这样做:
;with dateSequences(num, empId, orderDate) as
(
select ROW_NUMBER() over (order by orderdate) as num
, empId
, orderdate
from yourTable
),
dateGroups(groupNum, empId, orderDate, num) as
(
select currD.num, currD.empid, currD.orderDate, currD.num
from dateSequences currD
left join dateSequences prevD on prevD.num = currD.num - 1 and prevD.empid = currD.empId
where prevD.num is null
union all
select dg.groupNum, d.empId, d.orderDate, d.num
from dateSequences d
inner join dateGroups dg on dg.num + 1 = d.num and d.empId = dg.empId
)
select empId, min(orderDate) as MinDate, max(orderDate) as MaxDate
from dateGroups
where empId = 4
group by empId, groupNum
基本上它首先创建一个 CTE 以按日期顺序获取每一行的行号。然后它进行递归 CTE,首先找到所有没有先前顺序条目的组,然后将所有后续条目添加到同一组。最后,它获取分配了所有组号的记录,并按组号对它们进行分组,并获取最小和最大日期。