サンプル値を持つ4つのフィールドを有する「接続」テーブルから毎日受付比を計算しようとすると:で0受け入れ、1リクエストがあるためLEFTとacceptance_ratio計算JOINとSELF参加し、集約関数
date action sender_id recipient_id
'2017-01-05', 'request_link', 'frank', 'joe'
'2017-01-06', 'request_link', 'sally', 'ann'
'2017-01-07', 'request_link', 'bill', 'ted'
'2017-01-07', 'accept_link', 'joe', 'frank'
'2017-01-06', 'accept_link', 'ann', 'sally'
'2017-01-06', 'accept_link', 'ted', 'bill'
01-05の場合、その日の受入れ率は0/1 = 0でなければなりません。同様に、01/06の比率は2/1でなければなりません。
しかし、各accept_linkには対応するrequest_linkがあります。ここで、request_linkのsender_id = accept_linkのrecipient_idです(またその逆もあります)。そこで、ここでは自己参加が必要です。私は、Joeが日付にかかわらずFrankの要求を受け入れることを確実にすると確信しています。
必須の結合条件を維持しながら集計が正しく機能するように、次の問合せをどのように修正できますか。 2つのWHERE条件が削除された場合、または必要な場合、クエリは正しく計算されますか?事前に
date acceptance_ratio
'2017-01-05' 0.0000
'2017-01-06' 2.0000
'2017-01-07' 1.0000
ありがとう:
SELECT f1.date,
SUM(CASE WHEN f2.action = 'accept_link' THEN 1 ELSE 0 END)/
SUM(CASE WHEN f2.action = 'request_link' THEN 1 ELSE 0 END) AS acceptance_ratio
FROM connecting f1
LEFT JOIN connecting f2
ON f1.sender_id = f2.recipient_id
LEFT JOIN connecting f2
ON f1.recipient_id = f2.sender_id
WHERE f1.action = 'request_link'
AND f2.action = 'accept_link'
GROUP BY f1.date
ORDER BY f1.date ASC
の予想される出力は次のようになります。
カウントとは何ですか?リクエストリンクを持つ1人のユーザーと、受け入れリンクを持つ1人のユーザーですか?あなたの例では、フランク・ジョーとジョー・フランクの2つのレコードが4つあれば、どうなるでしょうか?この場合、二重カウントしたいですか? –
はい、accept_linkカウントは、送信側からの対応するrequest_linkがある場合にのみ有効です。 簡単にするために、この例ではfrank-joeとjoe-frankのレコードが2つしかないとしましょうが、ここで言及しましたが、クエリー内の複数のレコードをどのように考慮するべきか分かります。 –
http://meta.stackoverflow.com/questions/333952/why-should-i-provide-an-mcve-for-what-seems-to-me-to-be-a-very-simple-sql-クエリ – Strawberry