我正在尝试从表中获取连续值组。我一直试图找到一个关于这个的例子,但我无法在我的案例中使用它。
这是我所拥有的一小部分表。
CardID CardSerial CardStateID AssignUserID Denomination
----------- --------------------------- ----------- ------------ -------------
2685680 214026002 3 81 10
2685681 214026003 3 81 10
2685682 214026004 3 81 10
2685683 214026005 3 81 10
2685684 214026006 3 81 10
2685778 214026100 3 81 10
2685779 214026101 3 81 10
2685780 214026102 3 81 10
2685781 214026103 3 81 10
2685782 214026104 3 81 10
2685878 214026200 3 81 10
2685879 214026201 3 81 10
2685880 214026202 3 81 10
2685881 214026203 3 81 10
2685882 214026204 3 81 10
2685883 214026205 3 81 10
2685884 214026206 3 81 10
我期待的结果是:
min value max value cant Den
--------------- --------------- -------- ----
214026002 214026006 5 10
214026100 214026104 5 10
214026200 214026206 7 10
对我来说,困难的部分是获取一个组值来进行像
这样的查询select min(cardSerial), max(cardSerial), count(*), Den
from Cards
group by Den, GROUPING_VALUE_GENERATED
答案 0 :(得分:3)
假设cardSerial
是INT或其他数字数据类型......
WITH
sequenced AS
(
SELECT
ROW_NUMBER() OVER (PARTITION BY Denomination ORDER BY cardSerial) AS sequence_id,
*
FROM
Cards
)
SELECT
min(cardSerial),
max(cardSerial),
count(*),
Denomination
FROM
Sequenced
GROUP BY
Denomination,
cardSerial - sequence_id
ORDER BY
Denomination,
cardSerial - sequence_id
如果它不是数字数据类型,请在查询中将其转换为适当大的数字数据类型,以允许cardSerial - sequence_id
工作。
cardSerial - sequence_id
计算如何为分组提供有意义的内容......
214026002 - 01 = 214026001
214026003 - 02 = 214026001
214026004 - 03 = 214026001
214026005 - 04 = 214026001
214026006 - 05 = 214026001
214026100 - 06 = 214026094
214026101 - 07 = 214026094
214026102 - 08 = 214026094
214026103 - 09 = 214026094
214026104 - 10 = 214026094
214026200 - 11 = 214026189
214026201 - 12 = 214026189
214026202 - 13 = 214026189
214026203 - 14 = 214026189
214026204 - 15 = 214026189
214026205 - 16 = 214026189
214026206 - 17 = 214026189
答案 1 :(得分:0)
这个查询非常有用。我们可以针对各个组更新最小值吗。
例如,表中还有一列作为“Min_CardSerial”,此列的更新值为“214026002”,用于 214026002 和 214026006 之间的行, 214026100 表示 214026100 和 214026104 之间的行,依此类推。