2017-12-15 10 views
0

複数の結合を持つ選択で各グループの上位3を抽出しようとしています。トップ3は、電子メールアドレスとsymbol_shortフィールド(株式)でグループ化する必要があります。データには、symbol_shortがBitcoinである1レコード、XBYで4レコード、j @ doeでXVG、s @ doeで4レコードがあります。SQL Server上位3の結合での選択

それがこのような電子メールアドレスごとにグループ化されsymbol_shortのトップ3を返す必要があり、このような何か(簡単にするために取り除か他のカラム)

email  | symbol_short 
-----------+------------- 
[email protected] | Bitcoin  
[email protected] | XBY 
[email protected] | XBY 
[email protected] | XBY  
[email protected] | XBY  
[email protected] | XVG 
[email protected] | XBY 
[email protected] | XBY  
[email protected] | XBY  
[email protected] | XBY 

になります:

email  | symbol_short 
-----------+------------- 
[email protected] | Bitcoin  
[email protected] | XBY 
[email protected] | XBY 
[email protected] | XBY 
[email protected] | XVG 
[email protected] | XBY 
[email protected] | XBY  
[email protected] | XBY  

これは選択であります現在はすべての行を返します。

SELECT   
c_connection.email, c_alert.exchange, c_alert.symbol_short, c_alert.price_usd, 
c_history.alert_price, c_history.current_price, c_history.dynamic, 
c_history.positive_change, c_history.negative_change, c_history.created, c_connection.username 
FROM 
c_alert INNER JOIN c_history ON c_alert.id = c_history.id_alert INNER JOIN c_connection ON c_alert.login_key = c_connection.login_key 
ORDER BY c_connection.email, c_alert.symbol_short, c_history.created DESC 

メールのsymbol_shortグループのトップ3を取得することはできますか? 2フィールドソリューションは素晴らしいだろう、私は結果に上記のようにすべての '選択'フィールドが必要になる可能性があります。ありがとう!

最終的なクエリは、GordonLinoffの回答に基づいて微調整:

with t as (

     SELECT   
c_connection.email, c_alert.exchange, c_alert.symbol_short, c_alert.price_usd, 
c_history.alert_price, c_history.current_price, c_history.dynamic, 
c_history.positive_change, c_history.negative_change, c_history.created, c_connection.username 
FROM 
c_alert INNER JOIN c_history ON c_alert.id = c_history.id_alert INNER JOIN c_connection ON c_alert.login_key = c_connection.login_key 
-- ORDER BY c_connection.email, c_alert.symbol_short, c_history.created DESC 

    ) 
select t.* 
from (select t.*, row_number() over (partition by t.email, t.symbol_short order by t.email) as seqnum 
     from t 
    ) t 
where seqnum <= 3; 
+1

私はあなたが望む結果を得る方法を理解できません。 –

+0

私は、 'row_number over symbol_short'の解決策、または最初の3つの"ビットコイン "だけを取得するcteが@GordonLinoffを適用すると思います。 –

+0

Gordonは何を意味するのかよくわかりません... c_connection.email(email)とc_alert.symbol_short(symbol_short)それぞれのテーブルがあります。 – Rob

答えて

4

うーん。 。 。私はあなたがを最大3つの特定の電子メールの任意のシンボルしたいと思っています。もしそうなら:

with t as (
     <your query here> 
    ) 
selecct t.* 
from (select t.*, row_number() over (partition by email, symbol_short order by email) as seqnum 
     from t 
    ) t 
where seqnum <= 3; 
+0

ありがとう@GordonLinoff、それは少し微調整で働いた。 – Rob

関連する問題