【问题标题】:Get consecutive values in a group identified by min and max value获取由最小值和最大值标识的组中的连续值
【发布时间】:2012-11-14 14:52:16
【问题描述】:

我正在尝试从表中获取连续值组。我一直在尝试找到一个关于此的示例,但我无法在我的案例中使用它。

这是我的一张桌子的一小部分。

    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

【问题讨论】:

  • 顺便问一下GROUPING_VALUE_GENERATED 是什么?
  • cardSerial 是什么数据类型?

标签: sql sql-server sql-server-2008 group-by


【解决方案1】:

假设 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

【讨论】:

  • 非常感谢!!!你以一种非常好的方式使它成为可能!谢谢! :) 顺便说一句... CardSerial 它是一个 int 列,因此逻辑非常适合!
【解决方案2】:

这个查询非常有用。我们能否针对各个组更新最小值。

例如,表中的另一列是“Min_CardSerial”,对于 214026002 和 214026006 之间的行,此列要更新的值为“214026002”, 214026100 代表 214026100 和 214026104 之间的行,以此类推。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-03-28
    • 1970-01-01
    • 2010-11-23
    • 2011-08-16
    • 2017-12-13
    • 1970-01-01
    • 1970-01-01
    • 2023-03-20
    相关资源
    最近更新 更多