DB2 で結合を使用してテーブル全体のモードを計算する最も効率的な方法は何でしょうか..
特定の日付に特定の列 (ID - 結合されたテーブルの候補キー) の頻度 (カウント) が最も高い値を取得しようとしています。
アイデアは、いくつかのアカウント (同じ ID と日付) に対して異なる (値) を持つテーブルから最も一般的な (値) を取得することです。別のテーブルで使用できるように一意にする必要があります。
DB2 で結合を使用してテーブル全体のモードを計算する最も効率的な方法は何でしょうか..
特定の日付に特定の列 (ID - 結合されたテーブルの候補キー) の頻度 (カウント) が最も高い値を取得しようとしています。
アイデアは、いくつかのアカウント (同じ ID と日付) に対して異なる (値) を持つテーブルから最も一般的な (値) を取得することです。別のテーブルで使用できるように一意にする必要があります。
で示される共通テーブル式 [CTE] を使用WITH
して、ロジックを論理ステップに分割できます。最初に集計行を作成し、次に各グループ内の行にランキングを割り当ててから、レコード数が最も多い行を選択します。
各アイテムのどのフレーバーが各日付で最も頻繁に販売されているかを知りたいとしましょう (おそらくレコードが数量 1 であると仮定します)。
WITH s as
(
SELECT itemID, saleDate, flavor, count(*) as tally
FROM sales
GROUP BY itemID, saleDate, flavor
), r as
(
SELECT itemID, saleDate, flavor, tally,
RANK() OVER (PARTITION BY itemID, saleDate ORDER BY tally desc) as pri
FROM s
)
SELECT itemID, saleDate, flavor, tally
FROM r
WHERE pri = 1
ここで、名前「s」と「r」は、それぞれの CTE からの結果セットを指します。これらの名前は、ステートメントの別の部分でテーブルを表すために使用できます。
pri 列には、itemID と saleDate のウィンドウ内の最初のセクション「s」から集計行の集計値の RANK() が含まれます。最初に最大値が必要なため、Tally は降順です。RANK() は 1 になります。次に、メインの SELECT で、パーティション内で最初にあった集計レコードを選択するだけです。
RANK() または DENSE_RANK() を使用すると、itemID、saleDate の複数のフレーバーが 1 位に並んでいる場合に取得できます。これは RANK() を ROW_NUMBER() に置き換えることで解消できますが、同点のフレーバーの 1 つを勝者として任意に選択することになり、これは当面の問題に対する正しい答えではない可能性があります。
テーブルに販売数量列がある場合、COUNT(*) を SUM(salesqty) に置き換えて、最も多く販売されたものを見つけることができます。