1

目標は、各タイプと専門分野の組み合わせについて、最も一般的な 50 の手順コードを示すビューを作成することです。(特殊コードは異なるタイプで繰り返すことができます)

私は2つのテーブルを持っています:

テーブルprovidersには以下が含まれます:
provider_type
provider_specialty
provider_id
(およびこの問題には関係のないデータ)

テーブルのservices内容:
provider_id
procedure_code
(およびその他のデータ ポイント - 関連なし)

最終結果は次のようになります。

Provider Type  |  Provider Specialty |  Procedure Code  |  Count
---------------+---------------------+------------------+-------
00             |  01                 | 97012            |  500 
00             |  01                 | 97013            |  450
00             |  02                 | 97012            |  270
00             |  02                 | 97013            |  900
01             |  01                 | 97012            |  845
01             |  01                 | 97013            |  1200

何か案は?これが非常に複雑なクエリであることはわかっています。更新の周期性を実行するスクリプトを作成することだけを検討しましたが、より多くのリアルタイム データが必要です。

4

1 に答える 1

4

各タイプと専門分野の組み合わせに対する 50 の最も一般的な手順コード

次のように動作するはずです:

WITH x AS (
    SELECT p.provider_type, p.provider_specialty, s.procedure_code
          ,count(*) AS ct
          ,row_number() OVER (PARTITION BY p.provider_type, p.provider_specialty
                              ORDER BY count(*) DESC) AS r
    FROM   providers p
    JOIN   services s USING (provider_id)
    GROUP  BY 1,2,3
    )
SELECT x.provider_type, x.provider_specialty, x.procedure_code, x.ct
FROM   x
WHERE  x.r <= 50
ORDER  BY 1,2,4,3;

主なポイント

  • 私は CTE (PostgreSQL 8.4 以降) を使用していますが、サブクエリでも同じことができます。

  • ウィンドウ関数row_number()(これも PostgreSQL 8.4 以降)を使用して、最も一般的な 50 個の値を修飾しますprocedure_code

  • ORDER BY count(*)内で使用できることに注意してください。OVERつまり、ウィンドウ関数は集計関数の後に適用されるため、集計関数の結果をウィンドウ関数で使用します。

  • エイリアスがウィンドウ関数に認識されていないため、 で同じことを行うことはできませんでした。ORDER BY ct

  • 決勝SELECTは簡単です。各グループのトップ 50 を返すだけです。

于 2012-04-23T21:32:34.213 に答える