SQL запрос максимального значения на основе других столбцов - PullRequest
0 голосов
/ 02 июля 2018

Мне нужен максимальный ранг в каждом бронировании, а также франшиза с течением времени. Любые мысли о том, как запросить это?

id  reservation date    franch  rank
1   1           6/1/2017    1   234
2   1           6/1/2017    1   465
3   1           6/1/2017    1   851
4   1           6/1/2017    1   956
1   1           6/2/2017    2   658
2   1           6/2/2017    2   578
3   1           6/2/2017    2   578
4   1           6/2/2017    2   954
5   2           6/1/2017    1   436
6   2           6/1/2017    1   645
7   2           6/1/2017    1   854
8   2           6/1/2017    1   145
5   2           6/2/2017    3   98
6   2           6/2/2017    3   345
7   2           6/2/2017    3   867
8   2           6/2/2017    3   909

Вывод должен выглядеть как ... но обратите внимание, я также надеюсь не возвращать несколько записей, таких как 578 для резервирования 1 2/2/17 и франшизы 2.

id  reservation date    franch  rank
4   1           6/1/2017    1   956
2   1           6/2/2017    2   578
3   1           6/2/2017    2   578
7   2           6/1/2017    1   854
8   2           6/2/2017    3   909

Ответы [ 2 ]

0 голосов
/ 02 июля 2018

В большинстве баз данных я бы, вероятно, выбрал:

select t.*
from t
where t.id = (select t2.id
              from t t2
              where t2.reservation = t.reservation and t2.date = t.date 
              order by t2.rank desc
              fetch first 1 row only
             );

Но я не думаю, что Teradata поддерживает такие конструкции. Если я предполагаю, что вы хотите самый высокий идентификатор, то:

select t.*
from t
where t.id = (select max(t2.id)
              from t t2
              where t2.reservation = t.reservation and t2.date = t.date 
             );

Или вы можете использовать qualify:

select t.*
from t
qualify row_number() over (partition by reservation, date order by rank desc) = 1;

Использование row_number() обеспечивает одну строку на reservation / date, поэтому вы не получите дубликаты.

0 голосов
/ 02 июля 2018

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

SELECT *
FROM tab
QUALIFY RANK() OVER(PARTITION BY reservation,date,franch ORDER BY rank DESC) = 1
...