在同一列中填写其他数据的值(Teradata)
Fill in values from other data in the same column (Teradata)
我有一个 table,它是查询的结果(这是一个很大的查询!),看起来像这样。
Table 试图按类型计算每个 id 中的一组名称(seq_num 1,2..),但当不同类型出现在同一 id[=13 中时它会留下零=]
我想要一个看起来像这样的结果。
不能使用 subquery 或 max,因为这需要 group by 这会很痛苦,因为查询已经太复杂了。
在此非常感谢您的帮助。
谢谢!
最右边那些额外的 4 列的查询代码:
CASE WHEN (TYPE = 'E') THEN (DENSE_RANK() OVER (PARTITION BY ID,TYPE ORDER BY NAME) + DENSE_RANK() OVER (PARTITION BY ID, TYPE ORDER BY NAME DESC) - 1) ELSE 0 END AS NC_E,
CASE WHEN (TYPE = 'M') THEN (DENSE_RANK() OVER (PARTITION BY ID,TYPE ORDER BY NAME) + DENSE_RANK() OVER (PARTITION BY ID, TYPE ORDER BY NAME DESC) - 1) ELSE 0 END AS NC_M,
CASE WHEN (TYPE = 'D') THEN (DENSE_RANK() OVER (PARTITION BY ID,TYPE ORDER BY NAME) + DENSE_RANK() OVER (PARTITION BY ID, TYPE ORDER BY NAME DESC) - 1) ELSE 0 END AS NC_D,
CASE WHEN (TYPE = 'C') THEN (DENSE_RANK() OVER (PARTITION BY ID,TYPE ORDER BY NAME) + DENSE_RANK() OVER (PARTITION BY ID, TYPE ORDER BY NAME DESC) - 1) ELSE 0 END AS NC_C
注意:我有其他 ID,其中的 TYPE 没有改变,那是它工作正常的时候,我能理解为什么会这样。问题在于每个 ID 中的信息都非常不同。
您想要 COUNT(DISTINCT Name) OVER (PARTITION BY ID, TYPE)
,Teradata 不支持它。
最有效的方法是嵌套 OLAP 函数,这将导致两个 STAT 步,就像您当前的解决方案一样,所以这应该不会降低效率:
SELECT dt.*,
Max(CASE WHEN type = 'E' THEN nc END) Over (PARTITION BY id) AS NC_E
,Max(CASE WHEN type = 'M' THEN nc END) Over (PARTITION BY id) AS NC_M
,Max(CASE WHEN type = 'D' THEN nc END) Over (PARTITION BY id) AS NC_D
,Max(CASE WHEN type = 'C' THEN nc END) Over (PARTITION BY id) AS NC_C
FROM
(
SELECT ....
Dense_Rank() Over (PARTITION BY ID, TYPE_ ORDER BY NAME) AS nc
FROM ...
) AS dt
我有一个 table,它是查询的结果(这是一个很大的查询!),看起来像这样。
Table 试图按类型计算每个 id 中的一组名称(seq_num 1,2..),但当不同类型出现在同一 id[=13 中时它会留下零=]
我想要一个看起来像这样的结果。
不能使用 subquery 或 max,因为这需要 group by 这会很痛苦,因为查询已经太复杂了。
在此非常感谢您的帮助。 谢谢!
最右边那些额外的 4 列的查询代码:
CASE WHEN (TYPE = 'E') THEN (DENSE_RANK() OVER (PARTITION BY ID,TYPE ORDER BY NAME) + DENSE_RANK() OVER (PARTITION BY ID, TYPE ORDER BY NAME DESC) - 1) ELSE 0 END AS NC_E,
CASE WHEN (TYPE = 'M') THEN (DENSE_RANK() OVER (PARTITION BY ID,TYPE ORDER BY NAME) + DENSE_RANK() OVER (PARTITION BY ID, TYPE ORDER BY NAME DESC) - 1) ELSE 0 END AS NC_M,
CASE WHEN (TYPE = 'D') THEN (DENSE_RANK() OVER (PARTITION BY ID,TYPE ORDER BY NAME) + DENSE_RANK() OVER (PARTITION BY ID, TYPE ORDER BY NAME DESC) - 1) ELSE 0 END AS NC_D,
CASE WHEN (TYPE = 'C') THEN (DENSE_RANK() OVER (PARTITION BY ID,TYPE ORDER BY NAME) + DENSE_RANK() OVER (PARTITION BY ID, TYPE ORDER BY NAME DESC) - 1) ELSE 0 END AS NC_C
注意:我有其他 ID,其中的 TYPE 没有改变,那是它工作正常的时候,我能理解为什么会这样。问题在于每个 ID 中的信息都非常不同。
您想要 COUNT(DISTINCT Name) OVER (PARTITION BY ID, TYPE)
,Teradata 不支持它。
最有效的方法是嵌套 OLAP 函数,这将导致两个 STAT 步,就像您当前的解决方案一样,所以这应该不会降低效率:
SELECT dt.*,
Max(CASE WHEN type = 'E' THEN nc END) Over (PARTITION BY id) AS NC_E
,Max(CASE WHEN type = 'M' THEN nc END) Over (PARTITION BY id) AS NC_M
,Max(CASE WHEN type = 'D' THEN nc END) Over (PARTITION BY id) AS NC_D
,Max(CASE WHEN type = 'C' THEN nc END) Over (PARTITION BY id) AS NC_C
FROM
(
SELECT ....
Dense_Rank() Over (PARTITION BY ID, TYPE_ ORDER BY NAME) AS nc
FROM ...
) AS dt