【发布时间】:2020-02-16 12:35:14
【问题描述】:
我有一个 BIG(2300 万行)表 CONTRATOS,其中包含以下列:
SELECT
CONTRATO,
CODIGO_ORIGEN,
ORIGEN
FROM CONTRATOS;
CODIGO_ORIGEN 列有多行具有相同的值:
CODIGO_ORIGEN CONTRATO ORIGEN
------------- ---------- --------
1 345 CONT
1 363 BKP
1 645 BKP
1 365 CONT
我只需要为每个 CODIGO_ORIGEN 获取一个 CONTRATO,但始终优先考虑 'CONT' 值。所以在这个示例中,它将是值为 365
的 CONTRATO我正在尝试这样的事情:
SELECT
CODIGO_ORIGEN,
CASE
WHEN ORIGEN = 'CONT' THEN
FIRST_VALUE (CONTRATO) OVER (PARTITION BY CODIGO_ORIGEN ORDER BY CONTRATO DESC)
WHEN ORIGEN = 'BKP' THEN
FIRST_VALUE (CONTRATO) OVER (PARTITION BY CODIGO_ORIGEN ORDER BY CAMPO1 DESC, CAMPO2 DESC, CONTRATO DESC)
END AS CONTRATO
FROM CONTRATOS;
如果 ORIGEN 是“CONTR”,我应该按最高的 CONTRATO 排序并获得 CONTRATO 列。 如果 ORIGEN 是“BKP”,我应该按不同的列排序并获得 CONTRATO 列。
最后,我应该能够使用 CODIGO_ORIGEN -> CONTRATO (1:1) 拥有一个唯一的行。
有没有一种简单的方法可以做到这一点(1 个查询)?
提前致谢!
【问题讨论】:
-
仅添加一个示例数据表可能会替换所有文本,您应该这样做。
-
我添加了 2 个简单的查询来澄清这个案例。你明白这个问题吗?谢谢!
-
编辑问题并按照@TimBiegeleisen 的要求添加示例数据。这样得到好答案的机会就会增加。无论如何,回答您的问题(在评论中询问),否
-
大家好,我编辑了我的问题,希望您现在可以理解。谢谢!
-
您的需求仍然不明确。首先,您只显示 1 个 codigo_origen 值(一个糟糕的数据宇宙),并且复杂地优先考虑 origen -> cont。这是否意味着如果origen -> cont 然后排除origen -> bkp。从结果。此外,您的数据不完整,缺少您在查询中使用的 campo1 和 campo2 列。最后,您请求“带有 codigo_origen -> contrato (1:1) 的唯一行”这是什么意思?数据中似乎没有任何内容可以产生 (1:1) 的结果。
标签: sql oracle group-by subquery