Реализуйте density_rank () без использования аналитической функции в Teradata - PullRequest
0 голосов
/ 05 июня 2018

Ниже приведен набор данных.

select * from temp_denserow;
c1  c2  c3  c4
103 1   3   1
204 1   3   2
102 1   3   3
304 1   1   3
203 1   2   1
104 1   2   2
300 3   1   2
201 1   2   2
301 2   1   4
302 2   4   4
303 1   4   3
101 1   3   2
202 1   2   3

Я использую teradata, где нет встроенной функции densirank ().

DENSE_RANK () OVER (PARTITION BY c3 ORDER BY c3, c4) AS new_dense_rank

Я пытался реализовать приведенный выше оператор, но не смог получить желаемый результат.

select emp.*,
       (select count(distinct c3)
        from temp_denserow emp2
        where emp2.c3 = emp.c3 and
              emp2.c4 >= emp.c4
       ) as "new_dense_rank"
from temp_denserow emp;

Ожидаемый результат:

301 2   1   4   3
304 1   1   3   2
300 3   1   2   1
202 1   2   3   3
104 1   2   2   2
201 1   2   2   2
203 1   2   1   1
102 1   3   3   3
204 1   3   2   2
101 1   3   2   2
103 1   3   1   1
302 2   4   4   2
303 1   4   3   1

Ответы [ 2 ]

0 голосов
/ 05 июня 2018

Teradata поддерживает оконные функции, но не dense_rank() (по некоторым причинам).Итак, я бы использовал оконные функции:

select emp.*,
       sum(case when seqnum = 1 then 1 else 0 end) over (partition by emp.c3 order by emp.c4 rows between unbounded preceding and current row) as new_dense_rank
from (select emp.*,
             row_number() over (partition by emp.c3, emp.c4 order by emp.c4) as seqnum
      from temp_denserow emp
     ) emp;

Это должно иметь гораздо лучшую производительность, чем коррелированный подзапрос.

0 голосов
/ 05 июня 2018

Вы были близки.Проверьте DEMO , включите этот запрос и DENSE_RANK из postgresql для сравнения

select emp.*,
       (select count(distinct c4)
        from temp_denserow emp2
        where emp2.c3 = emp.c3 and
              emp2.c4 >= emp.c4
       ) as "new_dense_rank"
from temp_denserow emp
ORDER BY c3, c4 DESC;
...