0

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

表试图按类型计算每个 id 中的一组名称(seq_num 1,2..),但是当不同类型出现在同一个 id 中时它会留下零

我想得到一个看起来像这样的结果。

这是我想要的结果。

不能使用子查询或最大值,因为这需要 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 中的信息非常多样化。

4

1 回答 1

0

您需要一个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
于 2018-05-02T17:53:01.630 回答