Перечислите строки, в которых изменяется значение столбца - PullRequest
0 голосов
/ 27 сентября 2019

У меня есть такая таблица:

+---------+----------------+--------+-------+-------+
| ITEM NO | EFFECTIVE DATE | HEIGHT | WIDTH | DEPTH |
+---------+----------------+--------+-------+-------+
|    1    |   01/01/1980   |   01   |   01  |   01  |
|    2    |   03/16/1985   |   02   |   02  |   02  |
|    1    |   07/03/1985   |   01   |   02  |   01  |
|    3    |   08/01/1986   |   03   |   03  |   03  |
|    1    |   08/03/1986   |   02   |   02  |   01  |
|    3    |   09/01/1986   |   04   |   03  |   03  |
|    2    |   09/20/1987   |   02   |   06  |   02  |
|    3    |   10/01/1987   |   04   |   04  |   03  |
|    1    |   06/18/2000   |   03   |   02  |   01  |
+---------+----------------+--------+-------+-------+

Мне нужен запрос, который возвращает номер и дату элемента, когда изменяется только высота элемента.Таким образом, результаты будут следующими:

+---------+----------------+
| ITEM NO | EFFECTIVE DATE |
+---------+----------------+
|    1    |   01/01/1980   |
|    1    |   08/03/1986   |
|    1    |   06/18/2000   |
|    3    |   08/01/1986   |
|    3    |   09/01/1986   |
+---------+----------------+

Итак, высота элемента три изменялась три раза в указанные даты (включая его начальную высоту), высота элемента два не изменялась, поэтому игнорируется, а позиция тривысота менялась дважды, а значит, появляется дважды.

Спасибо за помощь!

Ответы [ 2 ]

2 голосов
/ 27 сентября 2019

Вот один из вариантов;он

  • находит предыдущие height (для item_no, упорядоченные по date) (строка № 14)
  • сортирует эти значения (строка № 15) - это будетиспользуется для отображения самого первого значения в наборе
    • возвращает строки
      • , чья "предыдущая" и "текущая" высота не совпадают (строка № 20)
      • , которыесначала в наборе (строка № 21)
      • , но эти элементы должны быть в наборе, который имеет разную высоту (строки № 23 - 25) (это условие исключает item_no = 2)

Вот, пожалуйста:

SQL> with test (item_no, effective_date, height) as
  2    (select 1, date '1980-01-01', '01' from dual union all
  3     select 2, date '1985-03-16', '02' from dual union all
  4     select 1, date '1985-07-03', '01' from dual union all
  5     select 3, date '1986-08-01', '03' from dual union all
  6     select 1, date '1986-08-03', '02' from dual union all
  7     select 3, date '1986-09-01', '04' from dual union all
  8     select 2, date '1987-09-20', '02' from dual union all
  9     select 3, date '1987-10-01', '04' from dual union all
 10     select 1, date '2000-06-18', '03' from dual
 11    ),
 12  temp as
 13    (select  item_no, effective_date, height,
 14             lag(height) over (partition by item_no order by effective_date) lheight,
 15             row_number() Over (partition by item_no order by effective_date) rn
 16     from test
 17    )
 18  select item_no, effective_date
 19  from temp
 20  where (   height <> lheight
 21         or rn = 1
 22        )
 23    and item_no in (select item_no from temp
 24                    group by item_no
 25                    having count(distinct height) > 1
 26                   )
 27  order by item_no, effective_date;

   ITEM_NO EFFECTIVE_
---------- ----------
         1 01/01/1980
         1 08/03/1986
         1 06/18/2000
         3 08/01/1986
         3 09/01/1986

SQL>
1 голос
/ 28 сентября 2019

Вы можете достичь этого, используя несколько analytical function.

select item_no, effective_date 
from
(select item_no, 
        effective_date,
        Lag(height) over 
          (partition by item_no order by effective_date) as prev_height,
        Count(distinct height) over 
          (partition by item_no) as cnt_height
From your_table)
Where cnt_height > 1
And (prev_height is null or height <> prev_height);

Cheers !!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...