2013-09-16 7 views
1

Мне нужно объединить два набора результатов, и я чувствую, что я так близко, но просто не вижу, как обернуть это все вверх:Как объединить несколько запросов?

Вот один запрос с небольшим набором результатов, (дайте мне Inactives)

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? – CharlesC

+0

Мне нужен статус 10. Но, если 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 

дата, что вы получили происходит в неактивном немного странно, но если вы хотите ограничить только поместить это в случае неактивных дат:

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_ активно, вы хотите, чтобы оно было неактивным или активным? Dazed-and-confused? Второй действительно простой; У меня есть два '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' ' – Ben

+0

Статус не имеет значения. Inactive_date говорит мне, что я неактивен. Мне просто нужны даты. –

0

Do 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

Переработал ответ. –

Смежные вопросы