[英]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
:使用
PIVOT
和LEFT 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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.