Выберите количество, отличное для списка вместо количества - PullRequest
0 голосов
/ 04 марта 2020

У меня следующий запрос:

select distinct(ord_nbr), ord_line_rate_nbr, count(distinct(ntwrk_key)), count(distinct(stn_key))
    from my_table
    where ord_nbr in (select distinct(ord_nbr) from another_table)
    group by 1,2
    order by 1 desc
 ;

Я хотел бы получить значение count(distinct(ntwrk_key)), count(distinct(stn_key)) и вместо этого заменить его списком различных значений.

Так сказать для строки 1, count(distinct(ntwrk_key)) == 5. Вместо этого я хотел бы вернуть [ntwk1, ntwk4, ntwk5, ntwk9, ntwk12]

РЕДАКТИРОВАТЬ: скажем, у нас есть эта таблица

+---------+-------------------+-----------+----------+
| ord_nbr | ord_line_rate_nbr | ntwrk_key | stn_key\ |
+---------+-------------------+-----------+----------+
|   12345 |                 1 | NTWK_A    | STN_A    |
|   12345 |                 1 | NTWK_B    | STN_A    |
|   12345 |                 1 | NTWK_C    | STN_B    |
|    9876 |                 2 | NTWK_F    | STN_A    |
|    9876 |                 3 | NTWK_F    | STN_A    |
|    9876 |                 3 | NTWK_F    | STN_A    |
|    9876 |                 3 | NTWK_F    | STN_A    |
+---------+-------------------+-----------+----------+

Мой текущий вывод:

+---------+-------------------+-----------+----------+
| ord_nbr | ord_line_rate_nbr | ntwrk_key | stn_key\ |
+---------+-------------------+-----------+----------+
|   12345 |                 1 | 3         | 2        |
|    9876 |                 2 | 1         | 1        |
|    9876 |                 3 | 1         | 1        | 
+---------+-------------------+-----------+----------+

Мой желаемый вывод:

+---------+-------------------+----------------------+-------------+
| ord_nbr | ord_line_rate_nbr |      ntwrk_key       |  stn_key\   |
+---------+-------------------+----------------------+-------------+
|   12345 |                 1 | NTWK_A,NTWK_B,NTWK_C | STN_A,STN_B |
|    9876 |                 2 | NTWK_F               | STN_A       |
|    9876 |                 3 | NTWK_F               | STN_A       |
+---------+-------------------+----------------------+-------------+

Как лучше всего go об этом?

Заранее спасибо!

1 Ответ

1 голос
/ 04 марта 2020

В Teradata все еще нет обобщенной функции агрегирования строк c, но есть несколько способов ее реализации. Основная проблема - это часть DISTINCT, для которой нужны вложенные ROW_NUMBER:

SELECT ord_nbr
  ,ord_line_rate_nbr 
  -- string aggregation
  ,Trim(Trailing ',' FROM (XmlAgg(Trim(ntwrk_key) ORDER BY ntwrk_key) (VARCHAR(1000))))
  ,Trim(Trailing ',' FROM (XmlAgg(Trim(stn_key)   ORDER BY stn_key) (VARCHAR(1000))))
FROM
 (
   SELECT
      ord_nbr
     ,ord_line_rate_nbr   
     ,CASE WHEN -- return only one of the duplicate values to emulate DISTINCT 
             Row_Number()
             Over (PARTITION BY ord_nbr,ord_line_rate_nbr, ntwrk_key 
                   ORDER BY ntwrk_key) = 1
           THEN ntwrk_key||','
           ELSE '' 
      END AS ntwrk_key 
     ,CASE WHEN
             Row_Number() -- return only one of the duplicate values to emulate DISTINCT 
             Over (PARTITION BY ord_nbr,ord_line_rate_nbr, stn_key
                   ORDER BY stn_key) = 1
           THEN stn_key||','
           ELSE ''
      END AS stn_key 
   FROM my_table
 ) AS dt
GROUP BY 1,2
ORDER BY 1 DESC;

Производительность зависит от общего числа строк и строк в группе.

...