Если вы хотите одну строку для каждого PERIOD_DATE, то вы, вероятно, хотите GROUP BY PERIOD_DATE
.Если вам все равно, какой PERIOD_SELECTION
выбран, то вы можете просто выбрать агрегатную функцию, чтобы выбрать для вас.Здесь я использую MAX, чтобы выбрать PERIOD_SELECTION
, который идет последним в алфавитном порядке («Конец предыдущего месяца», в данном случае).
-- sample data
with period_prompt as (select to_date('12/31/18', 'mm/dd/yy') as period_dt, 'Current Quarter End' as period_selection, 50000000 as db_order_no from dual
union all
select to_date('12/31/18', 'mm/dd/yy') as period_dt, 'Prior Month End' as period_selection, 40000000 as db_order_no from dual)
select period_date,
max(period_selection) as period_selection
from ( -- your query
SELECT PERIOD_DT as PERIOD_DATE, PERIOD_SELECTION
FROM PERIOD_PROMPT
WHERE db_ORDER_NO IN ( '60000000', '50000000', '40000000')-- 50.. = Current Quarter end, 60.. = current month end, 40.. = prior month end
UNION ALL
SELECT ADD_MONTHS(PERIOD_DT, -3) AS PERIOD_DATE
, 'Prior Quarter End' AS PERIOD_SELECTION
FROM PERIOD_PROMPT
WHERE db_ORDER_NO IN (50000000) --CURRENT QUARTER END
)
group by period_date;
Но если у вас есть мнения о , какой конкретный PERIOD_SELECTION должно отображаться, вам нужно их заказать - придумайте алгоритм сортировки.Иногда есть естественный выбор - как, может быть, вы хотите PERIOD_SELECTION
с самым высоким DB_ORDER_NO
.Но в этом случае я не уверен, что у вас есть хороший столбец для сортировки, поэтому мы создадим его.
В этом примере я добавляю столбец PRIORITY
и настраиваю еготак что db_order_no, равный 50000000 (конец текущего квартала), имеет приоритет 2, а все остальное имеет значение 1. Затем мы вызываем MAX (period_selection), но указываем, что мы хотим, чтобы запись period_selection имела самый высокий priority
.
with period_prompt as (select to_date('12/31/18', 'mm/dd/yy') as period_dt, 'Current Quarter End' as period_selection, 50000000 as db_order_no from dual
union all
select to_date('12/31/18', 'mm/dd/yy') as period_dt, 'Prior Month End' as period_selection, 40000000 as db_order_no from dual)
select period_date,
max(period_selection) keep (dense_rank first order by priority desc) as period_selection
from (
SELECT PERIOD_DT PERIOD_DATE, PERIOD_SELECTION,
case db_order_no
when 50000000 then 2
else 1
end as priority
FROM PERIOD_PROMPT
WHERE db_ORDER_NO IN ( '60000000', '50000000', '40000000')-- 50.. = Current Quarter end, 60.. = current month end, 40.. = prior month end
UNION ALL
SELECT ADD_MONTHS(PERIOD_DT, -3) AS PERIOD_DATE
, 'Prior Quarter End' AS PERIOD_SELECTION
, 1 as priority
FROM PERIOD_PROMPT
WHERE db_ORDER_NO IN (50000000) --CURRENT QUARTER END
)
group by period_date;
Вывод:
PERIOD_DATE PERIOD_SELECTION
----------- -------------------
30-SEP-18 Prior Quarter End
31-DEC-18 Current Quarter End