首页 > 解决方案 > SQL - 特定的分组/计数(避免游标)

问题描述

我正在尝试在没有游标的情况下进行特定的分组/计数。我知道用游标可以做到这一点,但我试图避免这种情况。我的表如下所示:

ID | Amount
1  | 1200
2  | 1200
3  | 2500
5  | 1200
6  | 1200
7  | 1200
8  | 2500

结果应该是

Count| Amount
2    | 1200
1    | 2500
3    | 1200
1    | 2500

标签: sqlsql-server

解决方案


这基本上是一种差距和孤岛的情况。

  • 数据存储在TEST表中
  • INTERCTE使用分析函数选择一行的AMOUNTLAG
  • INTER2CTE 创建组(使用SUM解析函数)
  • GRP最终查询按组(列)分组,按数量计算行数。我包括在内MIN(RN),只是为了设置正确的顺序。你可以删除它。

.

with 
inter as
  (select rn, amount, 
     isnull(lag(amount) over (order by rn), amount) l_amount
   from test
  ),
inter2 as
  (select rn, amount,
     sum(case when amount <> l_amount then 1 else 0 end) over (order by rn) grp
   from inter
  )
select min(rn) rn, amount, count(*) cnt
from inter2
group by amount, grp
order by 1;

SQL Fiddle 在这里。


推荐阅读