SQL 中连续行的 GROUP BY
给出下表:
ID State Date 12 1 2009-07-16 10:00 45 2 2009-07-16 13:00 67 2 2009-07-16 14:40 77 1 2009-07-16 15:00 89 1 2009-07-16 15:30 99 1 2009-07-16 16:00
问题:
如何按“状态”字段进行分组,同时仍然保持状态更改之间的边界?
SELECT MIN(ID) AS ID, State, MIN(Date) AS Date, COUNT(ID) AS Count
FROM table GROUP BY State
结果如下:
ID State Date Count 12 1 2009-07-16 10:00 4 45 2 2009-07-16 13:00 2
但这就是期望的输出:
ID State Date Count 12 1 2009-07-16 10:00 1 45 2 2009-07-16 13:00 2 77 1 2009-07-16 15:00 3
Is this possible in SQL? I didn't find a solution so far...
Given the following table:
ID State Date 12 1 2009-07-16 10:00 45 2 2009-07-16 13:00 67 2 2009-07-16 14:40 77 1 2009-07-16 15:00 89 1 2009-07-16 15:30 99 1 2009-07-16 16:00
Question:
How can i GROUP by the field "State", while still maintaining the borders between the state changes?
SELECT MIN(ID) AS ID, State, MIN(Date) AS Date, COUNT(ID) AS Count
FROM table GROUP BY State
results in the following:
ID State Date Count 12 1 2009-07-16 10:00 4 45 2 2009-07-16 13:00 2
but this is the desired output:
ID State Date Count 12 1 2009-07-16 10:00 1 45 2 2009-07-16 13:00 2 77 1 2009-07-16 15:00 3
Is this possible in SQL? I didn't find a solution so far...
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(5)
用于测试的表创建脚本:
Table creation scripts for testing:
这是在 MSSQL 服务器上使用 CTE 执行此操作的方法
This is how to do it with CTEs on MSSQL server
这里是一个更长的描述 Quassnoi 提供的解决方案如何工作
Here is a lengthier description of how solutions like the one offered by Quassnoi work
我可能在这里说的是显而易见的事情,但如果您愿意使用 Transact-SQL,您可以迭代表的行并构建您自己的结果集,这可能看起来很麻烦,但它肯定会起作用。 迭代可以不使用游标来完成。
I might be stating the obvious here, but if you're willing to make use of Transact-SQL, you can iterate through the rows of the table and build your own result set, which probably seems like a hassle, but it will definitely work. The iteration can be done without the use of cursors.
我为 BigQuery 创建了一个解决方案:
I created a solution for BigQuery: