sql - T-SQL 按条件对数据进行分组

标签 sql sql-server select window-functions gaps-and-islands

我有一些数据:

期间| id_帐户 |浮点值
24217 | 24217 303003 | 303003 0
24218 | 24218 303003 | 303003 0
24219 | 24219 303003 | 303003 1
24220 | 24220 303003 | 303003 1
24221 | 24221 303003 | 303003 0
24222 | 24222 303003 | 303003 0

我需要像这样对这些数据进行分组:

begin_period | end_period| id_account | float_value     
24217       | 24218     | 303003    |   0   
24219       | 24220     | 303003    |   1   
24221       | 24222     | 303003    |   0   

我通过分区和 while 循环尝试了 row_number,但没有成功。

最佳答案

我将其理解为间隙和 isald 问题,您希望将具有相同 id_account< 的记录中的“相邻”行(即具有相同 float_value 的行)分组在一起参数

这里,我认为最简单的方法是利用行号之间的差异来计算每条记录属于哪个组:

select
    min(period) begin_period,
    max(period) end_period,
    id_account,
    parameter,
    float_value
from (
    select 
        t.*,
        row_number() over(partition by id_account, parameter order by period) rn1,
        row_number() over(partition by id_account, parameter, float_value order by period) rn2
    from mytable t
) t
group by id_account, parameter, float_value, rn1 -rn2
order by id_account, parameter, begin_period

<强> Demo on DB Fiddle :

begin_period | end_period | id_account | parameter      | float_value
-----------: | ---------: | ---------: | :------------- | ----------:
       24217 |      24218 |     303003 | ACCOUNT_STATUS |           0
       24219 |      24220 |     303003 | ACCOUNT_STATUS |           1
       24221 |      24222 |     303003 | ACCOUNT_STATUS |           0

关于sql - T-SQL 按条件对数据进行分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62691560/

相关文章:

sql - 显示过去一周的数据(十亿行数据库)

sql - 计算一次查询中跨多个表的行数

mysql - INSERT INTO 其中某些数据依赖于选择

javascript - 在纯 JavaScript 中使用多个选择标签来过滤列表

MySQL - 即使计数为零,也将结果与列表匹配

mysql - 优化我的长mysql查询

mysql - 是否可以在维护查询的同时使用计数来获取总行数?

asp.net - 调用 DataContext.SubmitChanges() 时出现 StackOverflow 错误

SQL Server 列的大小差异

mysql - 如果 t1.uniqueNumber != t2.uniqueNumber,则从 t1 中选择全部