簡體   English   中英

如何從表中選擇特定值並避免重復?

[英]How to Choose a specific value from a table and to avoid duplicates?

我有兩個表:

主表

id AccountNum  status

1  11001   active
2  11002   active
3  11003   active
4  11004   active

添加表

id  date     description
1  01.2020   ACCOUNT.SET
1  02.2020   ACCOUNT.CHANGE
1  03.2020   ACCOUNT.REMOVE
2  04.2020   ACCOUNT.SET
2  05.2020   ACCOUNT.CHANGE
3  08.2020   ACCOUNT.SET
4  05.2020   ACCOUNT.SET
4  09.2020   ACCOUNT.REMOVE

我需要得到這樣的結果:

EffectiveFrom是設置 Account 的日期, EffectiveTo是刪除 Account 的日期

id AccountNum EffectiveFrom  EffectiveTo
1  11001       01.2020         03.2020
2  11002       04.2020          null 
3  11003       08.2020          null
4  11004       05.2020         09.2020

問題是,在加入 AddTable 后,我得到了重復項,但我只需要每個 Id 上的一行,並且只需要 ACCOUNT.SET、ACCOUNT.REMOVE 中的描述的日期。

您在尋找left join嗎?

  select m.id         as id,
         m.AccountNum as AccountNum,
         a.date       as EffectiveFrom,
         b.date       as EffectiveTo
    from MainTable m left join
         AddTable a on (a.id = m.id and a.description = 'ACCOUNT.SET') left join
         AddTable b on (b.id = m.id and b.description = 'ACCOUNT.REMOVE') 
order by m.AccountNum

使用PIVOTLEFT OUTER JOIN

SELECT m.id,
       a.EffectiveFrom,
       a.EffectiveTo
FROM   MainTable m
       LEFT OUTER JOIN
       (
         SELECT *
         FROM   AddTable
         PIVOT( MAX( dt ) FOR description IN (
           'ACCOUNT.SET' AS EffectiveFrom,
           'ACCOUNT.REMOVE' AS EffectiveTo
         ) )
       ) a
       ON ( a.id = m.id )
ORDER BY m.id

所以對於你的測試數據:

CREATE TABLE MainTable ( id, AccountNum, status ) AS
SELECT 1, 11001, 'active' FROM DUAL UNION ALL
SELECT 2, 11002, 'active' FROM DUAL UNION ALL
SELECT 3, 11003, 'active' FROM DUAL UNION ALL
SELECT 4, 11004, 'active' FROM DUAL;

CREATE TABLE AddTable ( id, dt, description ) AS
SELECT 1, DATE '2020-01-01', 'ACCOUNT.SET' FROM DUAL UNION ALL
SELECT 1, DATE '2020-01-02', 'ACCOUNT.CHANGE' FROM DUAL UNION ALL
SELECT 1, DATE '2020-01-03', 'ACCOUNT.REMOVE' FROM DUAL UNION ALL
SELECT 2, DATE '2020-01-04', 'ACCOUNT.SET' FROM DUAL UNION ALL
SELECT 2, DATE '2020-01-05', 'ACCOUNT.CHANGE' FROM DUAL UNION ALL
SELECT 3, DATE '2020-01-08', 'ACCOUNT.SET' FROM DUAL UNION ALL
SELECT 4, DATE '2020-01-05', 'ACCOUNT.SET' FROM DUAL UNION ALL
SELECT 4, DATE '2020-01-09', 'ACCOUNT.REMOVE' FROM DUAL;

這輸出:

\n身份證 | 效果自 | 有效於\n -: |  :------------ |  :----------\n  1 |  01-JAN-20 |  03-JAN-20  \n  2 |  04-JAN-20 | 空值       \n  3 |  08-JAN-20 | 空值       \n  4 |  05-JAN-20 |  09-JAN-20  \n

db<> 在這里擺弄

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM