0

1 つの列の最大値を取る結合を実行したい場合があります。これを行うには、max() と groupby- を実行する必要があります。これにより、最大の行から他の列を取得できなくなります (GROUP BY または集計関数に含まれていないため)。

これを修正するために、元のデータ ソースの最大値を結合して、他の列を取得します。ただし、私の問題は、これが複数の行を返す場合があることです。

だから、これまでのところ私は次のようなものを持っています:

SELECT * FROM
    (SELECT Col1, Max(Col2) FROM Table GROUP BY Col1) tab1
JOIN
    (SELECT Col1, Col2 FROM Table) tab2
ON tab1.Col2 = tab2.Col2

上記のクエリが 3 つの行 (column2 の最大値に一致する行) を返した場合、少し頭が痛くなります。

追加の列 col3 があり、上記のクエリによって返された行があった場合、Col3 の最小値などの列のみを返したいと思いました。これを行うにはどうすればよいでしょうか。

4

3 に答える 3

4

SQL Server 2005 以降を使用している場合。次に、次のようにします。

CTE 方式

;WITH CTE
AS
(
    SELECT
        ROW_NUMBER() OVER(PARTITION BY Col1 ORDER BY Col2 DESC) AS RowNbr,
        table.*
    FROM
        table
)
SELECT
    *
FROM
    CTE
WHERE
    CTE.RowNbr=1

サブクエリの方法

SELECT
    *
FROM
    (
    SELECT
        ROW_NUMBER() OVER(PARTITION BY Col1 ORDER BY Col2 DESC) AS RowNbr,
        table.*
    FROM
        table
    ) AS T
WHERE
    T.RowNbr=1
于 2012-06-07T09:25:11.667 に答える
1

SQL-Server 2005 以降を使用していると仮定すると、ここでWindow 関数を利用できます。ROW_NUMBER ()を選択しましたが、これだけではありません。

;WITH T AS
(   SELECT  *,
            ROW_NUMBER() OVER(PARTITION BY Col1 ORDER BY Col2 DESC) [RowNumber]
    FROM    Table
)
SELECT  *
FROM    T
WHERE   RowNumber = 1

PARTITION BYwithin the句OVERは、サブクエリの group by と同等ORDER BYであり、行の番号付けを開始する順序を決定します。この場合、col2 の最大値から開始します (ステートメントCol2 DESCに相当)。MAX

于 2012-06-07T09:28:14.493 に答える
1

私が得たように、それはこのようなものになる可能性があります

SELECT * FROM
    (SELECT Col1, Max(Col2) FROM Table GROUP BY Col1) tab1
JOIN
    (SELECT Col1, Col2 FROM Table) tab2
ON tab1.Col2 = tab2.Col2 and Col3 = (select min(Col3) from table )
于 2012-06-07T09:26:04.760 に答える