2

SQLServer2005を使用しています。

悪いテーブルのデザインについては、この投稿の終わりを参照してください。

2つの列があります。2列目の順番で1列目でグループ化したいと思います。Microsoftのドキュメントには、GROUP BY句は順序を考慮しないと記載されていますが、これを強制するにはどうすればよいですか?

これが私の疑似クエリです:

SELECT col_1,
       MIN(col_2),
       MAX(col_2)
FROM someTable
GROUP BY col_1 (*** WITH RESPECT TO ORDER OF col_2***)

次の表でクエリを実行した場合:

Col_1    Col_2
A       1
A       2
A       3
B       4
C       5
C       6
B       7
A       9

次の結果が得られるはずです。

Col_1  Min   Max
A      1     3
B      4     4
C      5     6
B      7     7
A      9     9

重要なのは、Aの4つのレコードすべてを結果セットにまとめることができないということです。テーブル/サブクエリがクエリされると、col_2で並べ替えられ、col_1の新しいインスタンスごとに新しいグループ化が行われます。おかげで、私はこれについて何も見つけることができませんでした。

テーブルのデザインはもできません。これは、プロプライエタリソフトウェアで使用される外部ベンダーによって作成されたテーブルでした。繰り返しますが、テーブルのデザインについては何もできません!!!!

4

3 に答える 3

8
;WITH T
     AS (SELECT Col1,
                Col2,
                DENSE_RANK() OVER (ORDER BY Col2) - 
                   DENSE_RANK() OVER (PARTITION BY Col1 ORDER BY Col2) AS G
         FROM   YourTable)
SELECT Col1,
       MIN(Col2) AS [Min],
       Max(Col2) AS [Max]
FROM   T
GROUP  BY Col1,
          G
ORDER  BY [Min] 
于 2010-10-05T22:15:35.463 に答える
2

このような質問は、ほとんどの場合、データベースの設計が正しくなく、必要な結果を返すことを意味します。

アイテムをシリーズにグループ化する場合は、これらのレコードが同じグループの一部であることを指定するフィールドが必要です。次に、col_1とseried_idの両方でグループ化できます。

行がどのシリーズに属するかを挿入時にどのように決定するかが問題であり、ビジネスルールによって異なります。データが順番に保存されていることに依存することはできないため、先に進む前にこのプロセスを修正する必要があります。そうしないと、データから正しい結果が得られません。

個人的に一緒に保存したいレコードのグループがあり、それらを同時に挿入する場合は、テーブル変数を持つストアドプロシージャを使用してそれらを挿入し、セットを一緒に挿入して、その時点でシリーズIDを割り当てることができます。 。すべてが同時に行われていない場合は、最後に挿入されたレコードをチェックして、競合状態が原因で問題となるseriesIDを特定する必要があります(すべてが一緒に挿入されている場合は、競合状態も考慮する必要があります。対処するのはそれほど難しくありません)。

データが何であるかについての詳細は、私たちがあなたを助ける方法を知るのに役立ちます、一般的なcol_1、col_2はこの時点では役に立ちません。これがどのような種類のデータであるかを知ることは、なぜあなたが要件を持っているのか、そしてこのタイプのデータが処理されるのを見た方法を提案する方法を理解するのに役立つかもしれません。

于 2010-10-05T18:47:40.510 に答える
0

私はあなたのテーブルとクエリを再作成しました、そして私は戻ってきました:

col1    (No column name)    (No column name)
A   1   9
B   4   7
C   5   6

MAX(col2)の部分の後にコンマが追加されているのに気づきました。これにより、現時点では、「実際の」クエリに、質問に入力した結果の原因となっている列が少なくとも1つあると思います。さらに役立つ情報が必要だと思います。

DECLARE @SomeTable TABLE (Col1 CHAR(1), Col2 INT)

INSERT INTO @SomeTable(Col1, Col2) VALUES('A', 1)
INSERT INTO @SomeTable(Col1, Col2) VALUES('A', 2)
INSERT INTO @SomeTable(Col1, Col2) VALUES('A', 3)
INSERT INTO @SomeTable(Col1, Col2) VALUES('B', 4)
INSERT INTO @SomeTable(Col1, Col2) VALUES('C', 5)
INSERT INTO @SomeTable(Col1, Col2) VALUES('C', 6)
INSERT INTO @SomeTable(Col1, Col2) VALUES('B', 7)
INSERT INTO @SomeTable(Col1, Col2) VALUES('A', 9)

SELECT col1, 
       MIN(col2), 
       MAX(col2)
FROM @SomeTable 
GROUP BY col1
于 2010-10-05T19:28:45.500 に答える