2017-01-28 7 views
2

私は夢中になっている質問があります。それは答えが可能である(または明らかである)ように思われるが、私はこの点まで困惑している。SQL-各クエリの結果を別々にフィルタリングする

ここに文脈があります。私は、製品ライセンスの有効期限の最後の90日以内にログインしたユーザーのうち、どのユーザーがもはや顧客ではなくなったことを把握しようとしています。問題は、ライセンスが期限切れになったときにフィルタが適用されることで、顧客ごとに異なります。

SELECT customer_id, email 
FROM customers 
WHERE last_login > ((SELECT license_end FROM customers)-7776000) 

これはlast_loginとlicense_end両方のUNIXタイムスタンプであるので、7776000が90日間秒変換である:私は当初、このようなクエリを記述してみました。すでにわかっているので、このサブクエリは複数の行を返して失敗します。おっとっと。

この場合、各ライセンス終了日は各顧客ごとに異なるため、ライセンスの最後の30日以内にlast_loginタイムスタンプを持つすべてのIDと電子メールを返す方法はありますか?

私はスプレッドシートでそれを行うことができますが、このパズルは私を狂っています。あなたの専門知識のために事前に感謝!

答えて

0

を必要としています。テーブルの同じ行の列を比較するだけです。

SELECT customer_id, email 
FROM customers 
WHERE last_login > license_end - 7776000 
+0

を実行します。私の混乱は、 '((SELECT unix_timestamp(license_end)FROM customers)-7776000)'が、 'SELECT'と' FROM'は完全に不要であることが判明しました。 (その列は実際にはUNIXではなくタイムスタンプです。)これは間違いなく機能しました。ありがとう!! – user7484388

+0

両方のカラムがタイムスタンプの場合は、 'DATE_SUB()'を使用してインターバルを減算します – Barmar

0

これらは同じ顧客テーブルに実際にある場合には(うまく正規化されていないようだその - しかし、OK)

、あなたはちょうどあなたがサブクエリを必要としないこの

SELECT customer_id, email 
FROM customers 
WHERE last_login > license_end-7776000 
+0

ええ、これらは実際には同じテーブルにはありません。質問の精神を単純化したいと思います。助けてくれてありがとう! – user7484388

+0

@ user7484388同じテーブルにない場合は、テーブルに参加する必要があります。次に、table1.last_login> table2.license_end - 7776000' – Barmar

関連する問題