有条件的在哪里?
Conditional Where?
使用以下table。我正在尝试获取 Party_ID。
我将只有 NEW_ORG_ID 和 ORIGINAL_ID。
使用 NEW_ORG_ID 我想得到 PARTY_ID 与 MAX(USR_CRTE_TS) unless ORIGINAL_ID 匹配以及。然后我想要 PARTY_ID 其中 NEW_ORG_ID 和 ORIGINAL_ID 匹配。
PARTY_ID |DIRS_ID |SUPPLIER_ID|ORIGINAL_ID|TRIANGLE_ID|NEW_ORG_ID|USR_CRTE_TS |
------------------|---------|-----------|-----------|-----------|----------|-------------------|
5385606962 |476800490|5385606962 |NULL |NULL |69214683 |2018-09-27 04:56:13|
69214683 |476800490|NULL |2740793553 |NULL |69214683 |2018-09-27 04:54:15|
我尝试了以下方法。请记住,我仅针对此示例对 NEW_ORG_ID 和 ORIGINAL_ID 进行了硬编码。在现实世界中,NEW_ORG_ID 和 ORIGINAL_ID 由查询的另一部分提供。
SELECT DISTINCT PARTY_ID
FROM UNIQUE_IDS UNQ
WHERE
(
CASE
WHEN (
SELECT ts.PARTY_ID
FROM UNIQUE_IDS ts
WHERE (ts.NEW_ORG_ID = '69214683' AND ts.ORIGINAL_ID = '2740793553')
) IS NOT NULL
THEN
(
SELECT ts.PARTY_ID
FROM UNIQUE_IDS ts
WHERE (ts.NEW_ORG_ID = '69214683' AND ts.ORIGINAL_ID = '2740793553')
)
ELSE
(
SELECT ts.PARTY_ID
FROM UNIQUE_IDS ts
WHERE ts.NEW_ORG_ID = '69214683'
AND ts.USR_CRTE_TS = (
SELECT MAX(ts.USR_CRTE_TS)
FROM UNIQUE_IDS ts
WHERE ts.NEW_ORG_ID = '69214683'
)--xref.SBL_GLOB_CSTMR_ID)
)
END
) = UNQ.NEW_ORG_ID
;
我会使用 row_number()
和条件排序:
select party_id
from (
select party_id,
row_number() over (order by case when original_id = '2740793553' then 1 end,
usr_crte_ts desc) rn
from unique_ids unq
where new_org_id = '69214683')
where rn = 1
如果 original_id
匹配,则行具有更高的优先级。第二优先级最高 usr_crte_ts
。最后我们拿下最好的一排。
可以用ROW_NUMBER()
解析函数得到标号为1的"best"匹配(先用ORIGINAL_ID
,再用USR_CRTE_TS
),过滤关于:
SELECT PARTY_ID
FROM (
SELECT PARTY_ID,
USR_CRTE_TS,
ROW_NUMBER() OVER (
PARTITION BY PARTY_ID
ORDER BY CASE ORIGINAL_ID
WHEN '2740793553' THEN 0
ELSE 1
END,
USR_CRTE_TS DESC
) RN
FROM UNIQUE_IDS
WHERE NEW_ORG_ID = '69214683'
)
WHERE RN = 1
如果USR_CRTE_TS
可以是NULL
,那么在最后再添加一个条件来符合你的条件:
AND (ORIGINAL_ID = '2740793553' OR USR_CRTE_TS IS NOT NULL)
当标准在别处select编辑时
您可以使用 WITH
子句逐层构建查询。
因此,让我们假设您已经有了 select 两个 "parameters" 的工作逻辑,然后将其放入 with
子句中,如下所示:
WITH CRIT(SEL_ORG_ID, SEL_ORIGINAL_ID) AS (
SELECT '69214683', '2740793553' FROM DUAL -- this is just an example
)
...然后像这样继续查询:
), BASE AS (
SELECT UI.PARTY_ID,
UI.USR_CRTE_TS,
UI.ORIGINAL_ID,
CRIT.SEL_ORIGINAL_ID,
ROW_NUMBER() OVER (
PARTITION BY UI.PARTY_ID
ORDER BY CASE UI.ORIGINAL_ID
WHEN CRIT.SEL_ORIGINAL_ID THEN 0
ELSE 1
END,
UI.USR_CRTE_TS DESC
) RN
FROM UNIQUE_IDS UI,
CRIT
WHERE UI.NEW_ORG_ID = CRIT.SEL_NEW_ORG_ID
)
SELECT PARTY_ID
FROM BASE
WHERE RN = 1
AND (ORIGINAL_ID = SEL_ORIGINAL_ID OR USR_CRTE_TS IS NOT NULL)
使用以下table。我正在尝试获取 Party_ID。 我将只有 NEW_ORG_ID 和 ORIGINAL_ID。
使用 NEW_ORG_ID 我想得到 PARTY_ID 与 MAX(USR_CRTE_TS) unless ORIGINAL_ID 匹配以及。然后我想要 PARTY_ID 其中 NEW_ORG_ID 和 ORIGINAL_ID 匹配。
PARTY_ID |DIRS_ID |SUPPLIER_ID|ORIGINAL_ID|TRIANGLE_ID|NEW_ORG_ID|USR_CRTE_TS |
------------------|---------|-----------|-----------|-----------|----------|-------------------|
5385606962 |476800490|5385606962 |NULL |NULL |69214683 |2018-09-27 04:56:13|
69214683 |476800490|NULL |2740793553 |NULL |69214683 |2018-09-27 04:54:15|
我尝试了以下方法。请记住,我仅针对此示例对 NEW_ORG_ID 和 ORIGINAL_ID 进行了硬编码。在现实世界中,NEW_ORG_ID 和 ORIGINAL_ID 由查询的另一部分提供。
SELECT DISTINCT PARTY_ID
FROM UNIQUE_IDS UNQ
WHERE
(
CASE
WHEN (
SELECT ts.PARTY_ID
FROM UNIQUE_IDS ts
WHERE (ts.NEW_ORG_ID = '69214683' AND ts.ORIGINAL_ID = '2740793553')
) IS NOT NULL
THEN
(
SELECT ts.PARTY_ID
FROM UNIQUE_IDS ts
WHERE (ts.NEW_ORG_ID = '69214683' AND ts.ORIGINAL_ID = '2740793553')
)
ELSE
(
SELECT ts.PARTY_ID
FROM UNIQUE_IDS ts
WHERE ts.NEW_ORG_ID = '69214683'
AND ts.USR_CRTE_TS = (
SELECT MAX(ts.USR_CRTE_TS)
FROM UNIQUE_IDS ts
WHERE ts.NEW_ORG_ID = '69214683'
)--xref.SBL_GLOB_CSTMR_ID)
)
END
) = UNQ.NEW_ORG_ID
;
我会使用 row_number()
和条件排序:
select party_id
from (
select party_id,
row_number() over (order by case when original_id = '2740793553' then 1 end,
usr_crte_ts desc) rn
from unique_ids unq
where new_org_id = '69214683')
where rn = 1
如果 original_id
匹配,则行具有更高的优先级。第二优先级最高 usr_crte_ts
。最后我们拿下最好的一排。
可以用ROW_NUMBER()
解析函数得到标号为1的"best"匹配(先用ORIGINAL_ID
,再用USR_CRTE_TS
),过滤关于:
SELECT PARTY_ID
FROM (
SELECT PARTY_ID,
USR_CRTE_TS,
ROW_NUMBER() OVER (
PARTITION BY PARTY_ID
ORDER BY CASE ORIGINAL_ID
WHEN '2740793553' THEN 0
ELSE 1
END,
USR_CRTE_TS DESC
) RN
FROM UNIQUE_IDS
WHERE NEW_ORG_ID = '69214683'
)
WHERE RN = 1
如果USR_CRTE_TS
可以是NULL
,那么在最后再添加一个条件来符合你的条件:
AND (ORIGINAL_ID = '2740793553' OR USR_CRTE_TS IS NOT NULL)
当标准在别处select编辑时
您可以使用 WITH
子句逐层构建查询。
因此,让我们假设您已经有了 select 两个 "parameters" 的工作逻辑,然后将其放入 with
子句中,如下所示:
WITH CRIT(SEL_ORG_ID, SEL_ORIGINAL_ID) AS (
SELECT '69214683', '2740793553' FROM DUAL -- this is just an example
)
...然后像这样继续查询:
), BASE AS (
SELECT UI.PARTY_ID,
UI.USR_CRTE_TS,
UI.ORIGINAL_ID,
CRIT.SEL_ORIGINAL_ID,
ROW_NUMBER() OVER (
PARTITION BY UI.PARTY_ID
ORDER BY CASE UI.ORIGINAL_ID
WHEN CRIT.SEL_ORIGINAL_ID THEN 0
ELSE 1
END,
UI.USR_CRTE_TS DESC
) RN
FROM UNIQUE_IDS UI,
CRIT
WHERE UI.NEW_ORG_ID = CRIT.SEL_NEW_ORG_ID
)
SELECT PARTY_ID
FROM BASE
WHERE RN = 1
AND (ORIGINAL_ID = SEL_ORIGINAL_ID OR USR_CRTE_TS IS NOT NULL)