简体   繁体   English

如何从表中选择特定值并避免重复?

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

I have two tables:我有两个表:

MainTable主表

id AccountNum  status

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

AddTable添加表

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

I need to get a such result:我需要得到这样的结果:

EffectiveFrom is date when Account was set, EffectiveTo is date when Account was removed 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

The problem is that after joining on AddTable I get the duplicates, but I need just one row on every Id and only dates where the description in ACCOUNT.SET,ACCOUNT.REMOVE.问题是,在加入 AddTable 后,我得到了重复项,但我只需要每个 Id 上的一行,并且只需要 ACCOUNT.SET、ACCOUNT.REMOVE 中的描述的日期。

Are you looking for left join ?您在寻找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

Use a PIVOT and a LEFT OUTER JOIN :使用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

So for your test data:所以对于你的测试数据:

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;

This outputs:这输出:

\nID |身份证 | EFFECTIVEFROM |效果自 | EFFECTIVETO有效于\n-: | -: | :------------ | :------------ | :---------- :----------\n 1 | 1 | 01-JAN-20 | 01-JAN-20 | 03-JAN-20 03-JAN-20  \n 2 | 2 | 04-JAN-20 | 04-JAN-20 | null空值       \n 3 | 3 | 08-JAN-20 | 08-JAN-20 | null空值       \n 4 | 4 | 05-JAN-20 | 05-JAN-20 | 09-JAN-20 09-JAN-20  \n

db<>fiddle here db<> 在这里摆弄

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM