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;
性能取决于总行数和每组行数。
我有以下查询:
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;
性能取决于总行数和每组行数。