5

テーブルから連続した値のグループを取得しようとしています。これに関する例を見つけようとしましたが、私の場合は使用できませんでした。

これは私が持っているテーブルのごく一部です。

    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
4

2 に答える 2

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
于 2012-11-14T14:57:09.530 に答える
0

このクエリは非常に便利です。それぞれのグループに対して最小値を更新できますか?

表の例では、「Min_CardSerial」としてもう 1 つの列があり、この列で更新​​する値は、214026002 と 214026006 の間の行の場合は「214026002」、214026100 と 214026104 の間の行の場合は 214026100 などです。

于 2021-06-11T15:39:04.653 に答える