了解自我加入查询

时间:2017-10-10 09:20:54

标签: sql

这是我的第一篇文章。希望你能帮我解决这个愚蠢的问题:

我的桌子上有一些ID车的动作和日期。

enter image description here

我只需要ID 'IN'和ID 'OUT'之间的日期间隔。

这是我的查询和我得到的结果。

SELECT  
    T1.ID, T1.DATE_ID, T2.ID as ID_2, T2.DATE_ID AS DATE_2,
    DATEDIFF("D", T1.DATE_ID, T2.DATE_ID) AS DaysDiff
FROM    
    My database T1
JOIN 
    My database T2 ON T1.ID = 'IN' AND T2.ID = 'OUT'
WHERE 
    T1.DATE_ID >= '2017/01/01' AND T2.DATE_ID >= '2017/01/01'
GROUP BY 
    T1.ID, T1.DATE_ID, T2.ID, T2.DATE_ID 
ORDER BY
    DATE_ID 

输出:

ID  DATE         ID_2       DATE_2       DaysDiff
-------------------------------------------------
IN  2017/02/15   OUT        2017/04/26    70
IN  2017/02/15   OUT        2017/10/05   232
IN  2017/04/26   OUT        2017/04/26     0        
IN  2017/04/26   OUT        2017/10/05   162

问题是,为什么我得到额外的行(第二和第三)以及如何解雇它们?

非常感谢提前。

2 个答案:

答案 0 :(得分:0)

似乎你错过了条件T1.DATE_ID < T2.DATE_ID

SELECT  T1.ID, T1.DATE_ID, T2.ID as ID_2, T2.DATE_ID AS DATE_2,
        DATEDIFF("D", T1.DATE_ID, T2.DATE_ID) AS DaysDiff

FROM My database T1
JOIN My database T2 ON T1.ID = 'IN' 
        and T2.ID = 'OUT'

WHERE T1.DATE_ID >= '2017/01/01' and T2.DATE_ID >= '2017/01/01'
AND T1.DATE_ID <  T2.DATE_ID
group by T1.ID, T1.DATE_ID, T2.ID, T2.DATE_ID 
order by DATE_ID 

答案 1 :(得分:0)

好吧,我试过但是: ID DATE ID_2 DATE_2 DaysDiff IN 2017/02/15 OUT 2017/04/26 70 IN 2017/02/15 OUT 2017/10/05 232 IN 2017/04/26 OUT 2017/10/05 162

正确的输出应该是: OUTPUT 在2017/02/15 OUT 2017/04/26 70 在2017/04/26 OUT 2017/10/05 162