複数の結合を持つ選択で各グループの上位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;
私はあなたが望む結果を得る方法を理解できません。 –
私は、 'row_number over symbol_short'の解決策、または最初の3つの"ビットコイン "だけを取得するcteが@GordonLinoffを適用すると思います。 –
Gordonは何を意味するのかよくわかりません... c_connection.email(email)とc_alert.symbol_short(symbol_short)それぞれのテーブルがあります。 – Rob