找到最大独特的数据集。从3列值

问题描述 投票:1回答:2

成像下表

  • ID:PrimaryKey的(序列号生成的)
  • 可乐:ForeignKey的(数)
  • COLB:ForeignKey的(数)
  • COLC:ForeignKey的(数)
  • 状态:枚举(数字)10,20,30,... 90
  • ValidFrom:时间戳(6)
  • LASTUPDATE:(6)

我知道创建查询来获取最高状态(70岁及以上)的组合可乐,COLB和COLC应该具有唯一性的任意组合。如果有validfrom可用的最高会赢。如果状态90有2个最新的会获胜:

因此,对于一些像这样的表

|------|------|------|-------|-------------|------------|
| 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
|------|------|------|-------|-------------|------------|

所以你可以看到可乐的组合,COLB和COLC应在年底独特。

于是我开始写剧本给了我一切,每个组合的最高状态的数据:

   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在2个不同的查询(和使用工会)的问题。所以,我试图扩大该基地选择这样一个ValidFrom让所有= NULL && MAX(ValidFrom)!

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);

但是,这似乎并没有工作,因为现在没有什么IST打印。

我期待只是行:5和9! [在1起始;-)]

我目前得到的行:5,7和9!

因此,组合[3,2,1]是重复的。

我不知道为什么第二NOT EXISTS不起作用。这就像有0F ***给出!

sql oracle
2个回答
0
投票

使用row_number()

dbfiddle demo

select * 
  from (
    select row_number() over (
                        partition by cola, colb, colc 
                        order by state desc, validfrom desc nulls last, lastupdate desc) rn, 
           foo.*
      from foo)
  where rn = 1

7胜利反对9因为2018-12-022018-10-18更新。

说明:

  • partition by cola, colb, colc导致对于这些列编号的每个组合是单独完成的,
  • 下一个是排序的条件,因此更高state胜,那么新的,不能为空validfrom胜并在结束新lastupdate胜。

对于qazxsw POI的每个组合,我们得到单独的带编号的行。外查询筛选唯一编号为qazxsw POI行。


0
投票

我找到了答案。而不是使用NOT EXISTS我试图用最高,RPAD和凝聚创建一个字符串,我比较:

a, b, c

这将创建一个简单的字符串从列州VALIDFROM和LASTUPDATE的值,然后试图找到这些最大!与具有最高数量,并配备在前面的国家,说明!

© www.soinside.com 2019 - 2024. All rights reserved.