2012-11-14 58 views
4

我试图从表中获取连续值组。我一直在试图找到一个关于这个例子,但我没有能够在我的情况下使用它。获取由最小值和最大值确定的组中的连续值

这是我有的表格的一小部分。

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

是什么'GROUPING_VALUE_GENERATED'的方式具有实际意义的群体? –

+0

什么数据类型是'cardSerial'? – MatBailie

回答

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 
+0

非常感谢!你以一种非常好的方式使它变得可行!谢谢! :)顺便说一句... CardSerial它是一个int列,所以逻辑非常好! – user1257292

相关问题