1

create view "data" as select [...]ステートメントの結果としての生データ:

projectId   resourceId  num

1052785922  318153743   10
1052785922  318153743   20
1052785922  318153743   30

1052785936  -2097765361 20
1052785936  318153743   10
1052785936  528513104   30

1052786014  -2097765361 20
1052786014  318153743   10
1052786014  528513104   30

1052786021  -2097765361 20
1052786021  318153743   10
1052786021  528513104   30

1052786099  -2097765361 20
1052786099  318153743   10

上記のデータをフィルタリングして、projectId ごとに max(num) の行のみを取得しようとしました。

推定結果:

projectId   resourceId  num

1052785922  318153743   30
1052785936  528513104   30
1052786014  528513104   30
1052786021  528513104   30
1052786099  -2097765361 20

num = max(num)self left join on 、window-function like 、または CTEの可能性については知っていmax(num) over ( partition by projectId )ますが、num の値が最も高いものを選択する他の可能性があるかどうか疑問に思います。

背景: 上記のデータは、比較的複雑な大きなビューの一部に過ぎません。これはビューなので、CTE などについてはこのように考えていません。ビューで提供されるデータは、計画アプリにフィードするためのものであり、ランタイムは非常に重要です。苦労して、パフォーマンスの高いビュー選択で終わることはしたくありません。

上記の「生データ」は、数十のテーブルのデータを組み合わせたビューの結果です。このビューの作成ステートメントでグループ化された最大値を一度にフィルタリングする方法を探しています。その間に追加のレイヤーやビューを配置する必要はありません!

4

3 に答える 3

3

このような:

WITH CTE
AS
(
  SELECT *,
    ROW_NUMBER() OVER(PARTITION BY projectId ORDER BY num DESC) rownum
  FROM Table1
)
SELECT projectId,   resourceId,  num
FROM CTE
WHERE rownum = 1;

SQL フィドルのデモ

これにより、次のことが得られます。

|  PROJECTID |  RESOURCEID | NUM |
----------------------------------
| 1052785922 |   318153743 |  30 |
| 1052785936 |   528513104 |  30 |
| 1052786014 |   528513104 |  30 |
| 1052786021 |   528513104 |  30 |
| 1052786099 | -2097765361 |  20 |
于 2013-01-10T15:18:27.823 に答える
1

このメガスクリプトはソートを使用しません;)試してください

SELECT *
FROM dbo.test3 t 
WHERE EXISTS (
              SELECT 1
              FROM dbo.test3                              
              WHERE projectId = t.projectId
              GROUP BY projectId
              HAVING MAX(num) = t.num
              )

SQLFiddle のデモ

于 2013-01-10T17:19:02.023 に答える
0

UDFマフムードが行うべき方法でデータを前処理するために、select from aとしてビューを作成しました。最終的に複数回実行できるUDF代わりに、一時テーブルを使用できます。CTE

ヒントをくれてありがとう!

于 2013-01-14T13:02:01.370 に答える