1

私は多くの例を見てきましたが、これを理解することはできません。疲れた脳には単純すぎるかもしれません。私はテーブルを持っています。すべての列を選択する必要があります。

ID  CAT PRODUCT
=======================
1   21  Product1
2   21  Product2
3   23  Product2
4   24  Product3
5   24  Product5
6   25  Product4
7   25  Product6

私は戻る必要があります

ID  CAT PRODUCT
=======================
1   21  Product1
3   23  Product2
4   24  Product3
7   25  Product6

ID と PRODUCT は同じ場合と異なる場合があります。条件は必要ありません。カテゴリ (CAT) は区別する必要があります。THE 返される値は同じ行からのものである必要があります。

Mysql では次のことができますが、MSSQL はそれを好みません。

SELECT * FROM テーブル GROUP BY CAT

4

2 に答える 2

4

id で並べ替えられた最初の行を取得するには、cat で区別して、これを使用します

select id, cat, product from
(
   Select *,
     ROW_NUMBER() OVER (PARTITION BY cat ORDER BY ID) as num
   from table

) t
where num = 1

これにより、group by (以下のように) によって作成されるグループ内の各要素の数が作成され、最初の要素が選択されます。


これで十分です。なぜこの結果が必要なのか想像できません。

select max(id) , cat, max(product)
from table
group by cat

また

select min(id) , cat, min(product)
from table
group by cat

動作します。

集計関数を使用する必要があります。この関数は、group by で見つかった値のセットで使用するアイテムを選択します。

たとえば、猫でグループ化すると、「結合」する必要がある 2 つの行があります。

1   21  Product1
2   21  Product2

id 列と product 列では、集計関数 max() を使用する場合、使用する 2 つの値のいずれかを選択する必要があります。これらの値の最大値を選択します。同様に、 min() はそれらの値の最小値を提供します。

于 2013-05-23T10:38:51.863 に答える
2

ID が一意または主キーの場合、代替ソリューションは次のようになります。

SELECT tn.ID, tn.Cat, tn.Product  -- or just tn.* if all columns are to be selected
FROM
    (
        SELECT ID = MIN(ID)
        FROM TableName
        GROUP BY CAT
    ) x 
    INNER JOIN TableName tn ON
        x.ID = tn.ID

ネストされた 'x' クエリは、一意のカテゴリ CAT ごとに最小の ID を選択し、内部結合は必要な ID を持つ TableName から行を返します。


元の答え。

これで、「列の値を同じ元の行から取得したい場合にすべきでないこと」と読む必要があります。下部の例は、データがどのように混合されるかを示すように変更されました。

Group By を使用する場合、TSQL では、使用するすべての列を GROUP BY 句にリストするか、集計関数 (MIN、MAX、AVG、COUNT など) 内に配置する必要があります。

したがって、どの列を区別する必要があるか、どの列を集計関数内に配置する必要があるか、どの集計関数が目的に適しているかを選択する必要があります。

列を区別する必要がありCATます-GROUP BYする必要があります。

ID 列と PRODUCT 列はいかなる条件にも制約されないため、それらを集計する場合があります。すべての集計関数のうち、MIN と MAX のみが目的に合っています。これらの関数は、適用される列の型を変更しないためです。

あなたの例から、ID列は常に最小値を取得するため、最良のオプションはMINを使用することです.

PRODUCT については、MIN または MAX の両方を使用できます。現在の例に違いはありません。

SELECT MIN(Id), Cat, MAX(Product)
FROM TableName
GROUP BY Cat

使い方:

ID  CAT PRODUCT      ID  CAT PRODUCT
=================    ================
1   21  Product1     1   21              -- 1 is minimums for CAT 21
2   21  Product2            Product2     -- Product2 is maximum for CAT 21
-----------------    ----------------
3   23  Product2     3   23 Product2      -- Only one row for CAT 23
-----------------    ----------------
4   24  Product3     4   24               -- 4 is minimum for CAT 24
5   24  Product5            Product5      -- Product5 is maximum for CAT 24 
-----------------    ----------------
6   25  Product4     6   25               -- 6 is minimum for CAT 25
7   25  Product6            Product6      -- Product6 is maximum for CAT 25

したがって、結果は次のようになります。

ID  CAT PRODUCT
=================
1   21  Product2
3   23  Product2
4   24  Product5
6   25  Product6

できるように、CAT は区別されますが、列の値は行間で混在しています。

于 2013-05-23T10:40:01.213 に答える