在同一列中填写来自其他数据的值(Teradata)

在同一列中填写来自其他数据的值(Teradata),teradata,teradata-sql-assistant,Teradata,Teradata Sql Assistant,我有一个表,它是一个查询的结果(这是一个大表!),看起来像这样。 表试图按类型统计每个id中的一组名称(seq_num 1,2..),但当同一id中出现不同类型时,表将保留零 我想得到一个像这样的结果 无法使用subquery或max,因为这将需要group by,而group by将是一个难题,因为查询已经太复杂了 我真的很感谢你的帮助。 谢谢 最右侧额外4列的查询代码: CASE WHEN (TYPE = 'E') THEN (DENSE_RANK() OVER (PARTITION B

我有一个表,它是一个查询的结果(这是一个大表!),看起来像这样。

表试图按类型统计每个id中的一组名称(seq_num 1,2..),但当同一id中出现不同类型时,表将保留零

我想得到一个像这样的结果

无法使用subquery或max,因为这将需要group by,而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,其中的类型没有改变,只有当它工作正常时,我才能理解为什么会这样。问题在于每个ID中的信息非常不同。

您希望在(按ID、类型划分的分区)上有一个
计数(不同的名称)
,这在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

您能说明如何在现有查询中选择这些ColuJMN吗?这可能是一些简单的OLAP函数。我刚刚更新了它,希望能回答你的问题。谢谢你的快速回复。是的,这正是我想要做的。每次我必须使用刚创建的变量以避免分组时,都需要嵌套。我已经做过很多次了,所以我一直在努力避免它。但我想没有其他选择了。非常感谢你的帮助。非常感谢。顺便说一句,为什么他们没有为我们创建一个函数来进行唯一计数??我试着投票,但没有显示出来,因为我刚刚加入,lol@Shubham:
DISTINCT
在并行系统中是一个非常昂贵的操作,他们可能没有找到一种有效的方法来实现OLAP功能。