成像下表
我知道创建查询来获取最高状态(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 ***给出!
使用row_number()
:
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-02
比2018-10-18
更新。
说明:
partition by cola, colb, colc
导致对于这些列编号的每个组合是单独完成的,state
胜,那么新的,不能为空validfrom
胜并在结束新lastupdate
胜。对于qazxsw POI的每个组合,我们得到单独的带编号的行。外查询筛选唯一编号为qazxsw POI行。
我找到了答案。而不是使用NOT EXISTS我试图用最高,RPAD和凝聚创建一个字符串,我比较:
a, b, c
这将创建一个简单的字符串从列州VALIDFROM和LASTUPDATE的值,然后试图找到这些最大!与具有最高数量,并配备在前面的国家,说明!