Это звучит как простой вопрос, но я просто не могу найти правильный путь. учитывая упрощенную таблицу

with t as  (
select   ordernumber, orderdate,  case when ordertype in (5,21) then 1 else 0 end is_restore , ordertype, row_number() over(order by orderdate) rn from
( 
select to_date('29.08.08','DD.MM.YY') orderdate,'313' ordernumber, 1  as ordertype  from dual union all
select to_date('13.03.15','DD.MM.YY') orderdate, '90/4/2' ordernumber, 5  as ordertype from dual
)
)
select * from t -- where clause  should be here 

Input data

Для каждой строки is_restore гарантированно равен 1 или 0. Если в таблице есть строка, в которой is_restore = 1, выберите номер заказа, дату заказа этой строки и ничего больше. Если в таблице нет строки, где is_restore = 1, выберите ordernumber, orderdate строки, где rn = 1 (строка, где rn = 1 гарантированно существует в таблице) С учетом приведенных выше требований, что мне нужно указать, где пункт, чтобы получить следующее?

desirable output

1
Azat Usmanov 25 Дек 2018 в 13:43

2 ответа

Лучший ответ

Вы можете использовать ROW_NUMBER:

CREATE TABLE t
AS
select ordernumber, orderdate,
    case when ordertype in (5,21) then 1 else 0 end is_restore, ordertype,
    row_number() over(order by orderdate) rn
  from ( 
     select to_date('29.08.08','DD.MM.YY') orderdate,'313' ordernumber,
           1  as ordertype 
     from dual union all
     select to_date('13.03.15','DD.MM.YY') orderdate, '90/4/2' ordernumber,
            5  as ordertype
     from dual);

-------------------

with cte as (
  select t.*,
    ROW_NUMBER() OVER(/*PARTITION BY ...*/ ORDER BY is_restore DESC, rn) AS rnk
  from t
)
SELECT *
FROM cte
WHERE rnk = 1;

db <> демонстрация скрипта

1
Lukasz Szozda 25 Дек 2018 в 10:56

Вот sql, который не использует оконные функции, может быть, он будет полезен тем, чьи базы данных не поддерживают OVER (...) или когда есть индексированные поля, на которых основан запрос.

SELECT
* 
FROM t
WHERE t.is_restore = 1 
OR (
 NOT EXISTS (SELECT 1 FROM t WHERE t.is_restore = 1)
 AND t.rn = 1
)
0
Alex Sham 26 Дек 2018 в 14:46