sql запрос на указанную дату, если она не существует, указать последнюю дату - PullRequest
1 голос
/ 24 марта 2020

У меня есть эта таблица.

InformationValues ​​(attr, dateOfValue, цена)

Содержимое таблицы:

enter image description here

Мне нужно выбрать все атрибуты с одинаковой датой, если она не существует, должна быть выбрана последняя дата.

Например, с TO_DATE('01-jan-19')

Таблица решений должна выглядеть следующим образом:

enter image description here

Мой sql запрос на данный момент:

select iv.attr , price, dateofvalue from informationvalues iv where
 dateofvalue = (select max(dateofvalue) from informationvalues where attr = iv.attr) or
 dateofvalue = TO_DATE('01-jan-19');

Чего мне не хватает?

Ответы [ 3 ]

2 голосов
/ 24 марта 2020

С row_number() analyti c функция:

select t.attr, t.dateOfValue, t.price
from ( 
  select i.*,
    row_number() over (
      partition by attr 
      order by case when dateOfValue = to_date('01-jan-19') then 1 else 2 end, dateOfValue desc
    ) rn
  from InformationValues i
) t
where t.rn = 1

См. демо . Результаты:

> ATTR           | DATEOFVALUE | PRICE
> :------------- | :---------- | ----:
> age            | 01-JAN-19   |     2
> electronics    | 01-JAN-19   |   0.5
> gender         | 01-JAN-19   |     3
> hobbies        | 01-JAN-19   |   0.5
> homeAddress    | 01-JAN-20   |     7
> maritalStatus  | 01-NOV-18   |     1
> mobilePhone    | 01-JAN-19   |     5
> musicTaste     | 01-JUL-19   |   0.1
> socialContacts | 01-JAN-19   |     1
1 голос
/ 24 марта 2020

Пожалуйста, попробуйте:

select * from (
select attr, price, dateofvalue,
row_number() over (partition by attr order by dateofvalue desc) rn from informationvalues
) i where dateofvalue = date'2019-01-01'
or (rn = 1 and not exists (select 1 from informationvalues iv where iv.attr = i.attr and dateofvalue = date'2019-01-01') )
0 голосов
/ 24 марта 2020

Меня смутил вопрос

, если вы имеете в виду, выбранные данные вычеркнуты, попробуйте следующее:

Select  a.attr, Min(dateofvalue) dateofvalue_MIN, Max(dateofvalue) dateofvalue_MAX, price
From #TableName a
Inner Join (
    Select attr
    From #TableName
    Group By attr
    Having Count(1) > 1
    ) b On b.attr = a.attr
Group By a.attr, price

, если вы имеете в виду, выбранные данные не вычеркнуты Попробуйте это:

Select  a.attr, Min(dateofvalue) dateofvalue_MIN, Max(dateofvalue) dateofvalue_MAX, price
From #TableName a
Group By a.attr, price

Thx

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