2013-09-16 59 views
1

我需要兩個結果集結合起來,我覺得自己是如此接近,但就是不明白如何包裝這一切了:如何組合多個查詢?

這裏有一個查詢與小的結果集,(給我非活性)

select max(set_date) as most_recent_inactive, key_value, statusid 
from status_history 
where base_table = 'userinfo' 
and statusid = 10 and set_date > to_date('2012-10-01', 'YYYY-MM-DD') 
group by key_value,statusid 

recent_inactive key_value statusid 
2013-01-30 15 10 
2013-06-04 261 10 
2013-06-18 352 10 
2012-10-04 383 10 
2013-01-22 488 10 
2013-03-04 711 10 
2013-06-19 749 10 
2013-03-05 806 10 

一個小結果集的其它查詢(給我活性)

select max (set_date) as most_recent_active, key_value,statusid 
from status_history 
where base_table = 'userinfo' 
and statusid =11 
group by key_value,statusid 

recent_active key_value statusid 
2002-01-01 3 11 
2002-01-01 5 11 
2002-01-01 14 11 
2002-01-01 15 11 
2002-01-01 21 11 
2002-01-01 23 11 
2002-01-01 25 11 
2002-01-01 26 11 

我想對所有的活性和非活性的在一起,所以我的工會所有這些

select null as most_recent_active, max(set_date) as most_recent_inactive, key_value,statusid 
from status_history 
where base_table = 'userinfo' 
and statusid = 10 and set_date > to_date('2012-10-01', 'YYYY-MM-DD') 
group by key_value,statusid 
    UNION all 
select max(set_date) as most_recent_active, null as most_recent_inactive, key_value,statusid 
from status_history 
where base_table = 'userinfo' 
and statusid = 11 
group by key_value,statusid 
order by key_value 

recent_active recent_inactive key_value statusid 
2002-01-01 null 3 11 
2002-01-01 null 5 11 
2002-01-01 null 14 11 
null 2013-01-30 15 10 
2002-01-01 null 15 11 
2002-01-01 null 21 11 
2002-01-01 null 23 11 
2002-01-01 null 25 11 
2002-01-01 null 26 11 
2002-01-01 null 27 11 
2002-01-01 null 29 1 

問題是key_value 15是重複的。

的值是正確的,但我想,記錄和所有後續副本「扁平化」,排15和所有其他未來通過與設置這兩個日期字段一個記錄匹配。

同樣,我覺得我是如此接近,但我怎麼包裝這一切?

謝謝?

+0

當你壓平第15行時,你想要哪個狀態ID? – CharlesC

+0

我需要的10 statusid但是,如果recent_inactive有一個值,statusid永遠是10,因爲這是根據定義,我有一個停止日期,因爲他們是無效的,statusid 10 –

回答

1

這是假設您的不活動status_id總是小於您的活動status_id。如果還有其他可能的status_id值,這可能不起作用。

select max(most_recent_active), max(most_recent_inactive), key_value, min(status_id) 
from (select null as most_recent_active, max(set_date) as most_recent_inactive, key_value,statusid 
from status_history 
where base_table = 'userinfo' 
and statusid = 10 and set_date > to_date('2012-10-01', 'YYYY-MM-DD') 
group by key_value,statusid 
    UNION all 
select max(set_date) as most_recent_active, null as most_recent_inactive, key_value,statusid 
from status_history 
where base_table = 'userinfo' 
and statusid = 11 
group by key_value,statusid 
order by key_value) 
group by key_value 
3

您可以使用CASE語句拆分哪些處於非活動狀態,哪些處於活動狀態。默認情況下,如果不滿足的情況是NULL,所以你會得到你想要的。

select max(case when statusid = 10 then set_date end) as most_recent_inactive 
    , max(case when statusid = 11 then set_date end) as most_recent_active 
    , key_value 
    , max(statusid) as statusid 
    from status_history 
where base_table = 'userinfo' 
    and statusid in (10, 11) 
group by key_value, statusid 

你有在非活動正在進行的日期事情有些奇怪,但如果你想限制只是把這個在CASE非活動日期:

select max(case when statusid = 10 
         and set_date > to_date('2012-10-01', 'YYYY-MM-DD') 
        then set_date 
      end) as most_recent_inactive 
    , max(case when statusid = 11 then set_date end) as most_recent_active 
    , key_value 
    , max(statusid) as statusid 
    from status_history 
where base_table = 'userinfo' 
    and statusid in (10, 11) 
group by key_value, statusid 

我假設如果某些東西既處於活動狀態又處於非活動狀態,則需要顯示它處於活動狀態如果要將其顯示爲非活動狀態,請使用min(statusid);如果你想顯示兩個,那麼你需要另一列...遵循相同的邏輯;使用CASE語句。如果你不想要,那麼將它從SELECT和GROUP BY子句中完全刪除。

+0

第一個查詢是不好的,因爲我m獲得key_value的多個結果。第二個查詢,缺少表達式。 –

+0

如果某些東西不活動_and_活動,你希望它是不活躍或活躍@茫然和困惑?第二個很簡單;我有兩個'和',你可以刪除一個...但它會得出相同的結果。 – Ben

+0

statusid無關緊要。 inactive_date告訴我我不活躍。我只需要日期。 –

0

GROUP BY工會。

SELECT MAX(active) As most_recent_active, MAX(inactive) As most_recent_in_active, 
     key_value, statusid 
FROM 
(SELECT null as active, set_date as inactive, key_value, statusid 
FROM status_history 
WHERE base_table = 'userinfo' 
     AND statusid = 10 and set_date > to_date('2012-10-01', 'YYYY-MM-DD') 

    UNION ALL 

SELECT set_date as active, null as inactive, key_value, statusid 
FROM status_history 
WHERE base_table = 'userinfo' 
     AND statusid = 11) 

GROUP BY key_value, statusid 
ORDER BY by key_value 
+0

@Ben - 你是對的。謝謝。 –

+0

重做了答案。 –