Select 计数不同以列出而不是计数

Select count distinct to list instead of count

我有以下查询:

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。 相反,我想 return [ntwk1, ntwk4, ntwk5, ntwk9, ntwk12]

编辑:假设我们有这个 table

+---------+-------------------+-----------+----------+
| 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       |
+---------+-------------------+----------------------+-------------+

解决此问题的最佳方法是什么?

提前致谢!

Teradata 中仍然没有通用的字符串聚合函数,但有几种实现方法。主要问题是DISTINCT部分,需要嵌套ROW_NUMBERs:

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;

性能取决于总行数和每组行数。