2017-07-09 18 views
0

私はのように見えるのデータセットがあります。各都市の(合計金額の)収入でトップ3のホテルを表示するSQLグループ化と高密度のランクコンセプト

cust city hotel_id amount 
------------------------------- 
    A 1  252 3160 
    B 1  256 1893 
    C 2  105 2188 
    D 2  105 3054 
    E 3  370 6107 
    F 2  110 3160 
    G 2  150 1893 
    H 3  310 2188 
    I 1  252 3160 
    J 1  250 4000 
    K 3  370 5000 
    L 3  311 1095 

クエリを? 同じホテルを同じ都市の他の顧客が予約することができるので、合計金額を合計する必要があります。ここ

city hotel_id amount 
--------------------------- 
    1  252  6320 
    1  250  4000 
    1  256  1893 

    2  105  5242 
    2  110  3160 
    2  150  1893 

    3  370  11107 
    3  310  2188 
    3  311  1095 

答えて

2
SELECT 
    t.city, t.hotel_id, t.amount 
FROM 
(
    SELECT city, hotel_id, SUM(amount) AS amount, 
     ROW_NUMBER() OVER (PARTITION BY city ORDER BY SUM(amount) DESC) AS rn 
    FROM yourTable 
    GROUP BY city, hotel_id 
) t 
WHERE t.rn <= 3 
ORDER BY t.city, t.amount DESC; 

デモ:

Rextester

+0

hotel_id BY PARTITONが、我々は、市内やホテルのIDでパーティションする必要があり、合計で最大量を見つけるための量が私の更新の答えとデモをチェック@DreamerP –

+0

を獲得しました。 –

+1

ありがとうございます。もう1列(ネクタイ用)を追加し、高密度ランクを使用しました。確認できます。 –

0

あなたが最初にその列でグループに必要な各hotel_idの総合計を取得するには、そのグループの出力期待

都市によって構文の目的のために。 #tmpテーブルには必要なすべてのデータが含まれている必要があります。そのため、そこから各都市の上位3つのエントリを選択するだけです。

SELECT city, hotel_id, SUM(amount) AS 'total' INTO #tmp 
FROM [table] 
GROUP BY hotel_id, city 

(SELECT TOP 3 * 
FROM #tmp 
WHERE city = 1) 
UNION 
(SELECT TOP 3 * 
FROM #tmp 
WHERE city = 2) 
UNION 
(SELECT TOP 3 * 
FROM #tmp 
WHERE city = 3) 
+0

同じ都市にある異なるホテルの合計金額が同じであれば動作しますか? –

関連する問題