4

わかりましたので、group by を使用して SQL コマンドを実行するときに集計なしで特定のフィールドを取得できないことはわかっていますが、一意であることが保証されている主キーで集計を行っている場合は、その列の他の行を一緒に引っ張る方法になります。このようなもの:

SELECT Max(id), 
       foo, 
       bar 
FROM   mytable 
GROUP  BY value1, 
          value2 

したがって、ID は一意であることが保証されているため、foo と bar の値は 1 つだけになります。このようなクエリを生成する方法はありますか?

私はこれを試しましたが、この場合の MyTable には何百万もの行があり、これの実行時間は受け入れられません:

SELECT * 
FROM   mytable 
WHERE  id IN (SELECT Max(id) 
              FROM   mytable 
              GROUP  BY value1, 
                        value2) 
       AND ...

理想的には、少なくとも SQL Server 2005 までさかのぼって機能するソリューションが欲しいのですが、それ以降のバージョンでより良いソリューションがあれば、それも聞きたいです。

4

2 に答える 2

3

次のようなインデックスが定義されていることを確認してください。

CREATE NONCLUSTERED INDEX idx_GroupBy ON mytable (value1, value2)

IN行数が多いと遅くなる傾向があります。それはあなたをに変えるのを助けるかもしれませININNER JOIN

SELECT
    data.*
FROM
    mytable data
        INNER JOIN
    (
        SELECT id = MAX(id) 
        FROM mytable 
        GROUP BY value1, 
                 value2
    ) ids
        ON data.id = ids.id

残念ながら、SQL Serverには、これをさらに改善する機能はありません。

于 2012-10-17T16:16:03.077 に答える
-1

これを試して:

SELECT foo
       ,bar
       ,MAX(ID) OVER(Partition By Value1, Value2 Order by Value1,Value2)
FROM myTable

CREATE NONCLUSTERED INDEX myIndex ON MyTable(Value1,Value2) INCLUDE(foo,bar)

このNCIはクエリ全体をカバーするため、テーブルを検索する必要はまったくありません。

于 2012-10-17T16:18:58.093 に答える