SQL-特定的分组/计数(避免使用游标)

时间:2018-09-16 20:38:16

标签: sql sql-server

我正在尝试不使用光标进行特定的分组/计数。 我知道用游标可以做到这一点,但我正努力避免这种情况。 我的桌子看起来像这样:

totalInsideCircle

结果应该是

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

2 个答案:

答案 0 :(得分:0)

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

  • 数据存储在ItemList表中
  • TEST CTE使用INTER分析函数选择上一个行的AMOUNT
  • LAG CTE创建组(使用INTER2分析功能)
  • 最终查询将按组(SUM列)对每个数量的行进行计数。我包括GRP,只是为了设置正确的顺序。您可以将其删除。

MIN(RN)

SQL Fiddle is here.

答案 1 :(得分:0)

这是一个孤岛问题。我将使用行号的不同来解决此版本:

select amount, count(*)
from (select t.*,
             row_number() over (order by id) as seqnum,
             row_number() over (partition by amount order by id) as seqnum_a
      from t
     ) t
group by amount, (seqnum - seqnum_a);

为什么这种效果通常在您第一次看到时并不明显。目的是为相邻元素分配相同数量的组。

如果凝视子查询的结果,您将看到当数量相同且相邻时,这两个序列之间的差异是如何恒定的。剩下的只是聚合。

如果您知道id之间没有空隙,那么可以使用id代替seqnum