gpt4 book ai didi

sql-server - TSQL - 困难的分组

转载 作者:行者123 更新时间:2023-12-03 11:23:35 25 4
gpt4 key购买 nike

请参阅 fiddle :http://sqlfiddle.com/#!6/e6768/2

我有如下数据:

DRIVER  DROP
1 1
1 2
1 ReturnToBase
1 4
1 5
1 ReturnToBase
1 6
1 7
2 1
2 2
2 ReturnToBase
2 4

我正在尝试对我的数据进行分组,因此对于每个车手,每组返回基地都有一个分组编号。

我的输出应该是这样的:

DRIVER      DROP           GROUP
1 1 1
1 2 1
1 ReturnToBase 1
1 4 2
1 5 2
1 ReturnToBase 2
1 6 3
1 7 3
1 ReturnToBase 3
2 1 1
2 2 1
2 ReturnToBase 1
2 4 2

我试过结合使用窗口函数来获得这个结果,但到目前为止我还差得远

以下是我到目前为止所拥有的,它不应该是功能性的,我试图弄清楚它是如何完成的,如果它可能的话。

SELECT 
ROW_NUMBER() OVER (Partition BY Driver order by Driver Desc) rownum,
Count(1) OVER (Partition By Driver Order By Driver Desc) counter,
Count
DropNo,
Driver,
CASE DropNo
WHEN 'ReturnToBase' THEN 1 ELSE 0 END AS EnumerateRound
FROM
Rounds

最佳答案

您可以使用以下查询:

SELECT id, DRIVER, DROPno, 
1 + SUM(flag) OVER (PARTITION BY DRIVER ORDER BY id) -
CASE
WHEN DROPno = 'ReturnToBase' THEN 1
ELSE 0
END AS grp
FROM (
SELECT id, DRIVER, DROPno,
CASE
WHEN DROPno = 'ReturnToBase' THEN 1
ELSE 0
END AS flag
FROM rounds ) AS t

Demo here

此查询使用 SUM 的窗口版本和 OVER 子句中的 ORDER BY 来计算运行总计。此版本的 SUM 从 SQL Server 2012 AFAIK 开始可用。

为了获得正确的 GROUP 值,我们只需要稍微调整一下这个运行总值。

编辑:(归功于@Conrad Frix)

使用CROSS APPLY 代替内联 View 可以大大简化事情:

SELECT id, DRIVER, DROPno, 
1 + SUM(x.flag) OVER (PARTITION BY DRIVER ORDER BY id) - x.flag
FROM rounds
CROSS APPLY (SELECT CASE WHEN DROPno = 'ReturnToBase' THEN 1 ELSE 0 END) AS x(flag)

Demo here

关于sql-server - TSQL - 困难的分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32253331/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com