2015-06-30 3 views
2

У меня проблема с моим текущим запросом, я хочу получить запись/результат на основе столбца (пример column Status имеет значение new/pending/completed для запроса i выполнить, если есть 3 записи со статусом new, это должен быть фильтр, чтобы показывать 1 запись только с статусом new). Ниже мой текущий запрос, который получает дубликат столбца.Запрос на выбор строк на основе отдельных значений столбца

select a.CW_UPD_TMS, 
      case when a.CW_CRT_UID='AAA' then 'BBB' 
       else a.CW_CRT_UID end as CW_CRT_UID, 
      COALESCE(b.CW_S_BR, a.CW_S_BR) as CW_S_BR, 
      a.CW_TRX_STAT as STATUS, 
      SUBSTR(a.CW_UPD_TMS,7,2) as day, 
      SUBSTR(a.CW_UPD_TMS,5,2) as month, 
      SUBSTR(a.CW_UPD_TMS,1,4) as ayear, 
      SUBSTR(a.CW_UPD_TMS,9,2) as hours, 
      SUBSTR(a.CW_UPD_TMS,11,2) as mins, 
      SUBSTR(a.CW_UPD_TMS,13,2) as secs, 
      case when cast(SUBSTR(a.CW_UPD_TMS,9,2) as INT) > 12 then 'PM' 
       else 'AM' end as zone 
from TABLEA a 
    left outer join TABLEB b on a.CW_CRT_UID = b.CW_S_USR 
where a.CW_TRX_ID = '20150415110000798' 
union 
select a.CW_UPD_TMS, 
      case when a.CW_CRT_UID='AAA' then 'BBB' 
       else a.CW_CRT_UID end as CW_CRT_UID, 
      COALESCE(b.CW_S_BR, a.CW_S_BR) as CW_S_BR, 
      a.CW_TRX_STAT as STATUS, 
      SUBSTR(a.CW_UPD_TMS,7,2) as day, 
      SUBSTR(a.CW_UPD_TMS,5,2) as month, 
      SUBSTR(a.CW_UPD_TMS,1,4) as ayear, 
      SUBSTR(a.CW_UPD_TMS,9,2) as hours, 
      SUBSTR(a.CW_UPD_TMS,11,2) as mins, 
      SUBSTR(a.CW_UPD_TMS,13,2) as secs, 
      case when cast(SUBSTR(a.CW_UPD_TMS,9,2) as INT) > 12 then 'PM' 
       else 'AM' end as zone 
from TABLEC a 
    left outer join TABLEB b on a.CW_CRT_UID = b.CW_S_USR 
where a.CW_TRX_ID = '20150415110000798' 

Вот текущий результат:

CW_UPD_TMS   CW_CRT_UID CW_S_BR STATUS DAY MONTH AYEAR HOURS MINS SECS ZONE 
2015062610260746811 happy  KLC  NEW  26 06  2015 10  26  07  AM 
2015062610273984711 happy  KLC  NEW  26 06  2015 10  27  39  AM 
2015062610275762511 happy  KLC  NEW  26 06  2015 10  27  57  AM 

так как теперь я изменить запрос таким образом, чтобы показывать только 1 только запись (шоу с мин (CW_UPD_TMS)), а теперь 3 записи имеют такой же статус (Новый).

мой ожидаемый результат должен быть:

CW_UPD_TMS   CW_CRT_UID CW_S_BR STATUS DAY MONTH AYEAR HOURS MINS SECS ZONE 
2015062610260746811 happy  KLC  NEW  26 06  2015 10  26  07  AM 

жаль мой бедный английский.

+2

Вы не должны указать DISTINCT, когда вам выполните UNION, так как UNION удалит повторяющиеся строки. – jarlh

+0

Итак, если они не все имеют одинаковый статус, вы все равно хотите, чтобы эти строки сохраняли строку с самой ранней меткой времени в каждой группе? – shawnt00

+0

Не храните даты или временные метки в качестве символа, используйте тип данных DATE или TIMESTAMP! – jarlh

ответ

1

Ожидаемое поведение в вашем случае. Вы должны придумать еще один столбец в дополнение к «Статусу», чтобы они могли сформировать составной ключ, который будет уникальным, и вы получите для него одну запись.

Либо у вас могут быть такие критерии, как дата или что-то, что соответствует вашему требованию, и использовать атрибут номера строки для ограничения результата с помощью 1 записи.

Дайте мне знать, если это имеет смысл.

+0

привет, я думаю, что ваш путь работа, но я не в состоянии изменить дизайн таблицы :( – FruitLai

0

Это может быть хорошим началом, но я должен был предположить, что временная метка работает как первичный ключ. Вы должны указать, на какой платформе вы находитесь в вопросе. Это также может быть более чистым, если мы понимаем, что происходит с объединениями и союзом.

select 
    d.CW_UPD_TMS, CW_CRT_UID, CW_S_BR, STATUS, day, month, ayear, hours, mins, secs, zone 
from 
(
    select 
     a.CW_UPD_TMS, case when a.CW_CRT_UID='AAA' then 'BBB' else a.CW_CRT_UID end as CW_CRT_UID, 
     case when b.CW_S_BR is null then a.CW_S_BR else b.CW_S_BR end as CW_S_BR, a.CW_TRX_STAT as STATUS, 
     SUBSTR(a.CW_UPD_TMS,7,2) as day, SUBSTR(a.CW_UPD_TMS,5,2) as month, SUBSTR(a.CW_UPD_TMS,1,4) as ayear, 
     SUBSTR(a.CW_UPD_TMS,9,2) as hours, SUBSTR(a.CW_UPD_TMS,11,2) as mins,SUBSTR(a.CW_UPD_TMS,13,2) as secs, 
     case when cast(SUBSTR(a.CW_UPD_TMS,9,2) as INT) > 12 then 'PM' else 'AM' end as zone 
    from TABLEA a left outer join TABLEB b on a.CW_CRT_UID = b.CW_S_USR 
    where a.CW_TRX_ID = '20150415110000798' 
    union 
    select 
     a.CW_UPD_TMS, case when a.CW_CRT_UID='AAA' then 'BBB' else a.CW_CRT_UID end as CW_CRT_UID, 
     case when b.CW_S_BR is null then a.CW_S_BR else b.CW_S_BR end as CW_S_BR, a.CW_TRX_STAT as STATUS, 
     SUBSTR(a.CW_UPD_TMS,7,2) as day, SUBSTR(a.CW_UPD_TMS,5,2) as month, SUBSTR(a.CW_UPD_TMS,1,4) as ayear, 
     SUBSTR(a.CW_UPD_TMS,9,2) as hours, SUBSTR(a.CW_UPD_TMS,11,2) as mins,SUBSTR(a.CW_UPD_TMS,13,2) as secs, 
     case when cast(SUBSTR(a.CW_UPD_TMS,9,2) as INT) > 12 then 'PM' else 'AM' end as zone 
    from TABLEC a 
    left outer join TABLEB b on a.CW_CRT_UID = b.CW_S_USR 
    where a.CW_TRX_ID = '20150415110000798' 
) as d /* data */ inner join 
(
    select min(CW_UPD_TMS) as CW_UPD_TMS, CW_TRX_STAT 
    from (
     select a.CW_UPD_TMS, a.CW_TRX_STAT 
     from TABLEA a 
     where a.CW_TRX_ID = '20150415110000798' 
     union 
     select c.CW_UPD_TMS, c.CW_TRX_STAT 
     from TABLEC c 
     where c.CW_TRX_ID = '20150415110000798' 
    ) t0 
    group by CW_TRX_STAT 
) as r /* representative */ 
    on r.CW_UPD_TMS = d.CW_UPD_TMS and r.CW_TRX_STAT = d.CW_TRX_STAT 
+0

попробовал ваш запрос получить эту ошибку: Имя столбца 'CW_UPD_TMS' находится в нескольких таблицах в списке FROM. Я думаю, что ударил, когда внутреннее соединение r там. – FruitLai

+0

Это означает, что вам нужно было квалифицировать этот столбец в самом внешнем предложении 'select'. Я предполагаю, что изначально я думал, что собираюсь написать 'where in', а не внутреннее соединение ... – shawnt00

0

Чтобы получить самую старую запись, вам необходимо ранжировать записи по дате. Так что вы могли бы сделать это объединить TABLEA и TableC, дают ряд записей с 1 по старейшей в состоянии, то только сохранить эти записи ранг 1.

select a.cw_upd_tms, 
    case when a.cw_crt_uid='AAA' then 'BBB' 
     else a.cw_crt_uid end as cw_crt_uid, 
    coalesce(b.cw_s_br, a.cw_s_br) as cw_s_br, 
    a.cw_trx_stat as status, 
    substr(a.cw_upd_tms,7,2) as day, 
    substr(a.cw_upd_tms,5,2) as month, 
    substr(a.cw_upd_tms,1,4) as ayear, 
    substr(a.cw_upd_tms,9,2) as hours, 
    substr(a.cw_upd_tms,11,2) as mins, 
    substr(a.cw_upd_tms,13,2) as secs, 
    case when cast(substr(a.cw_upd_tms,9,2) as int) > 12 then 'PM' 
     else 'AM' end as zone 
from 
(
    select 
    cw_trx_stat, cw_crt_uid, cw_upd_tms 
    from 
    (
    select 
     cw_trx_stat, cw_crt_uid, cw_upd_tms, 
     row_number() over (partition by cw_trx_stat order by cw_upd_tms) as rn 
    from 
    (
     select cw_trx_stat, cw_crt_uid, cw_upd_tms 
     from tablea where cw_trx_id = '20150415110000798' 
     union all 
     select cw_trx_stat, cw_crt_uid, cw_upd_tms 
     from tablec where cw_trx_id = '20150415110000798' 
    ) combined 
) ranked 
    where rn = 1 
) a 
left outer join tableb b on a.cw_crt_uid = b.cw_s_usr; 
+0

привет сожалею, что моя СУБД - это Derby, и я запускаю запрос на Squirrel SQL – FruitLai

+0

Итак, это не SQL Server, но Apache Derby. Вышеуказанный запрос - это стандартный SQL. Самое продвинутое в этом - аналитическая функция ROW_NUMBER, которую Derby поддерживает с версии 10.4. Вы пробовали запрос? –

+0

ошибка при выполнении - Ошибка: Синтаксическая ошибка: Обнаружен «раздел» в строке 22, столбец 26. – FruitLai

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