3

質問はこれです。n 列のデータを持つテーブルがありますが、3 列の一意のセットごとに 1 つの行をリストしたいと考えています。

たとえば、テーブルが次のように構成されているとします。

ID | data1 | data2 | data3 | description | price | handler | creationTime | etc...

私がやろうとしているのは、このサブクエリを使用することです:

SELECT distinct data1, data2, data3 FROM Table_1

... 3 つの列のそれぞれの固有のバリエーションを取得します。しかし、そのような結果ごとに、テーブルから 1 つの完全な行を選択したいと考えています。

このクエリはかなり頻繁に使用するためのものであり、最適化する必要があります。これが、テーブル変数や while ループを使用できない理由の一種です。ヒントはありますか?

4

3 に答える 3

1

必要なのはWindows関数です。各グループから「最初の」行を返すクエリは次のとおりです。

select t.*
from (select t.*,
             row_number() over (partition by data1, data2, data3
                                order by (select NULL)) as seqnum
      FROM Table_1 t
     ) t
where seqnum = 1

(これには、「1」が含まれる最後のseqnum列も含まれます。)

アイデアは、各行にシーケンス番号を提供し、最初の行を取得することです。「orderby」句は必須です。このクエリの構文は、SQLServerで「順序は気にしない」と言う効率的な方法です。これは他のデータベースでは異なります。

于 2012-07-12T14:30:58.883 に答える
1

SQL Server を使用している場合は、共通テーブル式を使用してこれを行うことができます。

with minRow(ID) as 
    (select min(ID)
    from    Table_1
    group by data1, data2, data3)
select  t1.*
from    Table_1 t1 join minRow m1 on t1.ID = m1.ID
于 2012-07-12T12:07:28.933 に答える
1

DISTINCT の概念を理解していないと思います。あなたが持っている場合:

ID  data1  data2 data3 description1 price1
ID  data1  data2 data3 description2 price2

結果として何を期待していますか?ID data1 data2 data3は 1 回だけ返されますが、等しい列の中で異なる他の列はどうなるでしょうか?

あなたはいつでもできる

select distinct ID,  data1,  data2, data3, MAX(description1), MAX(price1)

解析して結果を返しますが、実際にはあまり意味がありません...

于 2012-07-12T11:55:23.653 に答える