首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >查找最大的唯一数据集。来自3列的值

查找最大的唯一数据集。来自3列的值
EN

Stack Overflow用户
提问于 2018-12-20 11:08:22
回答 1查看 59关注 0票数 1

成像下表

  • ID:PrimaryKey (序列生成的编号)
  • 可乐:ForeignKey(号码)
  • ColB:ForeignKey(号码)
  • ColC:ForeignKey(号码)
  • 状态:枚举(编号)10、20、30、. 90
  • 生效日期:时间戳(6)
  • LastUpdate:(6)

我知道创建了一个查询来获取处于最高状态(70及以上)的任何组合--组合ColA、ColB和ColC应该是unqiue。如果有一个有效的可用,最高将获胜。如果在90州有2名,那么最新的一名将获胜:

所以像这样的桌子

代码语言:javascript
复制
|------|------|------|-------|-------------|------------|
| ColA | ColB | ColC | State |ValidFrom    |LastUpdate  |
|------|------|------|-------|-------------|------------|
| 1    | 1    | 1    | 10    |  null       | 10.10.2018 | //Excluded
|------|------|------|-------|-------------|------------|
| 1    | 1    | 1    | 70    |  null       | 09.10.2018 | // lower State
|------|------|------|-------|-------------|------------|
| 1    | 1    | 1    | 90    |  null       | 05.05.2018 | // older LastUpdate
|------|------|------|-------|-------------|------------|
| 1    | 1    | 1    | 90    |  null       | 12.07.2018 | //Should Win
|------|------|------|-------|-------------|------------|
| 1    | 2    | 1    | 90    |  18.10.2018 | 12.07.2018 | //Should Win
|------|------|------|-------|-------------|------------|
| 1    | 2    | 1    | 90    |  null       | 18.11.2018 | //loose against ValidFrom
|------|------|------|-------|-------------|------------|
| 3    | 2    | 1    | 90    |  02.12.2018 | 04.08.2018 | //lower ValidFrom
|------|------|------|-------|-------------|------------|
| 3    | 2    | 1    | 70    |  19.10.2018 | 17.11.2018 | //lower state
|------|------|------|-------|-------------|------------|
| 3    | 2    | 1    | 90    |  18.10.2018 | 14.08.2018 | //Should win
|------|------|------|-------|-------------|------------|

因此,正如您所看到的,ColA、ColB和ColC的组合应该是不正确的。

因此,我开始编写一个脚本,为我提供每个组合具有最高状态的所有数据:

代码语言:javascript
复制
   SELECT MAINSELECT.*
FROM
   FOO MAINSELECT
WHERE 
   MAINSELECT.STATE >= 70
AND NOT EXISTS
   (    SELECT SUBSELECT.ID
    FROM 
        FOO SUBSELECT
    WHERE SUBSELECT.ID <> MAINSELECT.ID
       AND SUBSELECT.COLA = MAINSELECT.COLA
       AND SUBSELECT.COLB = MAINSELECT.COLB
       AND SUBSELECT.COLC = MAINSELECT.COLC
       AND SUBSELECT.STATE > MAINSELECT.STATE);

这让我处于最高境界。由于我不想使用OR语句,所以我试图解决在两个不同查询中查询NULL作为Validfrom或MAX的问题(并使用union)。因此,我尝试像这样扩展这个基SELECT,以便使用ValidFrom != null &Max(ValidFrom)获得所有内容:

代码语言:javascript
复制
SELECT MAINSELECT.*
FROM
   FOO MAINSELECT
WHERE 
   MAINSELECT.STATE >= 70
   MAINSELECT.VALIDFROM IS NOT NULL
AND NOT EXISTS
   (    SELECT SUBSELECT.ID
    FROM 
        FOO SUBSELECT
    WHERE SUBSELECT.ID <> MAINSELECT.ID
       AND SUBSELECT.COLA = MAINSELECT.COLA
       AND SUBSELECT.COLB = MAINSELECT.COLB
       AND SUBSELECT.COLC = MAINSELECT.COLC
       AND SUBSELECT.STATE > MAINSELECT.STATE)
AND NOT EXISTS
   (    SELECT SUBSELECT.ID
    FROM 
        FOO SUBSELECT
    WHERE SUBSELECT.ID <> MAINSELECT.ID -- Should not be the same
       AND SUBSELECT.COLA = MAINSELECT.COLA -- Same combination!
       AND SUBSELECT.COLB = MAINSELECT.COLB
       AND SUBSELECT.COLC = MAINSELECT.COLC
       AND SUBSELECT.STATE = MAINSELECT.STATE --Filter on same state!
       AND SUBSELECT.VALIDFROM > MAINSELECT.VALIDFROM);

但这似乎不起作用,因为现在什么都没有印刷。

我期待的只是排:5和9!从1开始;-)

我现在得到了第5,7和9排!

所以组合3,2,1是重复的。

我不明白为什么第二个不存在不起作用。就像被给予了一样!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-02-07 09:15:35

我找到了答案。我不是使用NOT存在,而是尝试使用max、rpad和coalesce来创建一个字符串,并进行比较:

代码语言:javascript
复制
SELECT 
    MAINSELECT.*
FROM 
    FOO MAINSELECT
WHERE (1 = 1)
    AND MAINSELECT.STATE >= 70
    AND coalesce(to_char(MAINSELECT.state), rpad('0', 3, '0') ) || coalesce(to_char(MAINSELECT.validfrom,'YYMMDDhh24missFF'), rpad('0', 18, '0') ) || coalesce(to_char(MAINSELECT.lastupdate,'YYMMDDhh24missFF'), rpad('0', 18, '0') )
    = (select max(coalesce(to_char(SUBSELECT.state), rpad('0', 3, '0') ) || coalesce(to_char(SUBSELECT.validfrom,'YYMMDDhh24missFF'), rpad('0', 18, '0') )|| coalesce(to_char(SUBSELECT.lastupdate,'YYMMDDhh24missFF'), rpad('0', 18, '0')))                
        FROM 
            FOO SUBSELECT
        WHERE (1 = 1)
            AND SUBSELECT.STATE >= 70
            AND SUBSELECT.COLA = MAINSELECT.COLA
            AND SUBSELECT.COLB = MAINSELECT.COLB
            AND SUBSELECT.COLC = MAINSELECT.COLC
  );

这将使用列状态、VALIDFROM和LASTUPDATE的值创建一个简单的字符串,然后尝试查找这些值的最大值!说明与国家,谁有最高的数字,并出现在前面!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53867477

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档