2017-01-09 55 views
0

我需要一個SQL語句,它將返回一個結果集,其中包含在一個時間範圍內狀態碼爲'DE'且狀態碼爲'PE'的人員ID在另一個時間段之間。 實施例表SQL用於檢索兩個日期範圍的結果集

id | name 
--- ------ 
1 Joe 
2 Jane 

status | start_date | end_date | person_id 
------- ------------ ----------- ----------- 
    DE 2016-12-01 2016-12-28 1 
    PE 2017-02-01 2017-02-28 1 
    DE 2016-12-01 2016-12-28 2 

如果「DE」時間表很2016年12月1日和2016年12月28日和「PE」時限之間是2017年2月1日和2017年2月28日之間我會期望喬被返回到查詢集合中。

回答

0

我不明白你需要什麼。

但是,

SELECT * FROM table1 where (select count(*) from table2 where table1.id = table2.person_id and (([status] = 'DE' and start_data between '2016-12-01' and '2016-12-28') or ([status] = 'PE' and start_data between '2017-02-01' and '2017-02-28')) > 0 
1

你最好的,像這樣的問題的辦法是把它們分解成單獨的SQL,所以在這個表去兩次。一旦爲DE,並再次爲PE

SELECT name FROM table WHERE status = 'DE' and start_date = '2016-12-01' AND end_date = '2016-12-28'; 

SELECT name FROM table WHERE status = 'PE' and start_date = '2017-02-01' AND end_date = '2017-02-28'; 

現在你已經有了結果集,你可以測試針對對方:

SELECT name 
FROM 
    (SELECT name FROM table WHERE status = 'DE' and start_date = '2016-12-01' AND end_date = '2016-12-28') t1 
    INNER JOIN (SELECT name FROM table WHERE status = 'DE' and start_date = '2016-12-01' AND end_date = '2016-12-28') t2 ON t1.name = t2.name; 

既然你實際上並沒有從選擇第二個派生表,您可以使用相關的子查詢,並使用相同的邏輯:

SELECT name 
FROM table t1 
WHERE 
    status = 'DE' and 
    start_date = '2016-12-01' AND 
    end_date = '2016-12-28' AND 
    name IN (SELECT name FROM table t2 WHERE t1.name = t2.name status = 'PE' and start_date = '2017-02-01' AND end_date = '2017-02-28'); 

這可能會表現更好。

0

我不知道哪個SQL您正在使用,但此查詢應該可以正常工作與PostgreSQL的

select Res.name from (
       select * from table1 inner join table2 on Table1.id = Table2.person_id 
       where (status = 'DE' and start_date >= '2016-12-01' and end_date <= '2016-12-28') 
       or 
       (status = 'PE' and start_date >= '2017-02-01' and end_date <= '2017-02-28') 
        ) as Res 
    group by Res.name having count(*) > 1 

或者您可以使用此語句以及

select table1.name from table1 
inner join table2 t1 on table1.id = t1.person_id 
where status = 'DE' and start_date >= '2016-12-01' and end_date <= '2016-12-28' 
and 
exists (select 1 from table2 t2 where t2.person_id = t1.person_id and 
status = 'PE' and start_date >= '2017-02-01' and end_date <= '2017-02-28')