2017-08-21 8 views
0

1つのテーブル(テーブル1)のデータを比較する方法を見つけるのに問題があります。これは翌月の新しいアイテムであるとして、表1SQL - 1つのテーブルのデータを比較します

Date  ID  Item   
----  ------- ----- 
2017-06-30 90  2200 
2017-06-30 150  1200 
2017-06-30 150  1201 
2017-06-30 150  1202 
2017-06-30 150  1203 
2017-06-30 150  1204 
2017-07-31 150  1201 
2017-07-31 150  1202 
2017-07-31 150  1203 
2017-07-31 150  1204 
2017-07-31 150  1205 
2017-07-31 90  2200 

パートは私が取得したいと思い、結果は1205年です。もしそれが翌月にもはやないアイテム、例えば1200を得ることができれば、いいかもしれません。

** EDITED:私が言及すべきことの1つは、ID1のID欄にも異なるIDがあるということです。したがって、主な目標は、正確なID = 150(160または180ではなく)を比較することです。 **

私はアドバイスをいただき、ありがとうございます。

は...あなたは

+0

それは – Strawberry

答えて

0

例:ありがとう:

SELECT x.* 
    FROM my_table x 
    LEFT 
    JOIN my_table y 
    ON y.id = x.id 
    AND y.date = '2017-06-30' 
    AND y.item = x.item 
WHERE x.date = '2017-07-31' 
    AND y.id IS NULL; 

または

SELECT x.* 
    FROM my_table x 
    LEFT 
    JOIN my_table y 
    ON y.id = x.id AND y.date = x.date - INTERVAL 1 MONTH 
    AND y.item = x.item 
WHERE x.date = '2017-07-31' 
    AND y.id IS NULL; 

I残りの部分は読者のための練習として残していただろうが、私の計画は甘やかされていると思う。

+0

ありがとうございました!私はそれを私自身で書き、それを理解しようとします。確認したい正確なIDを選択できる行も追加しました。 – michal2805

+0

@ michal2805実際にSOに感謝の気持ちを表明する仕組みがあることに注意してください。言ってるだけ'。 – Strawberry

0

前の数ヶ月中に含まれていなかったか、前の数ヶ月で引退した項目を選択するには

select 'new item' as result_type, item 
from MyTable a1 
where not exists 
(
select 1 
from MyTable a2 
where a1.item = a2.item 
and a2.Date < a1.date -- change this to a date function to compare to previous month only 
) 
union all 
select 'retired item' as result_type, item 
from MyTable a1 
where not exists 
(
select 1 
from MyTable a2 
where a1.item = a2.item 
and a2.Date > a1.date -- change this to a date function to compare to previous month only 
) 
+0

が返信いただきありがとうございます;-)、私はこれを確認しようとする私には十分に明らかだ@ADyson私自身。 私が言及すべきことの1つは、Table1はID列に異なるIDも持つということです。 主な目標は、正確なID = 150(160または180ではなく)を比較することです。 – michal2805

1

あなたは1月に「新」アイテムと「削除」の項目の両方が必要な場合:

select 'new', t.* 
from t 
where not exists (select 1 
        from t t2 
        where t2.item = t.item and 
         year(t2.date) = year(t.date - interval 1 month) and 
         month(t2.date) = month(t.date - interval 1 month) 
       ) 
union all 
select 'deleted', t.* 
from t 
where not exists (select 1 
        from t t2 
        where t2.item = t.item and 
         year(t2.date) = year(t.date + interval 1 month) and 
         month(t2.date) = month(t.date + interval 1 month) 
       ); 
関連する問題