SQL 开发者,检索其中一个值最后或第一个无关紧要
SQL developer, retriev one of the values last or first doesn't matter
我有一个名为 generalledger_mgmt
的 table,其中包含许多列。我编写了查询来执行一些操作,select 其中一些如下所示。
我的问题是其中一些行重复(有时符号不同,有时符号相同,但无论如何,对于我的报告,我认为它们是重复的)并且我只想检索其中一行(可以是最后一个还是第一个对我来说并不重要,只要我每个'serial
') 得到一行 - 我怎样才能调整我的代码来实现它?
table:
rowsortid
COMPANYID
serial
TRANSDATEID
AMOUNTLC
CURRENCYCODE
20211109-ICJ-565
SSE
222
20211101
500
SEK
20211109-ICJ-564
SSE
222
20211105
-500
SEK
20211109-ICT-562
SSE
202
20211001
600
SEK
20211109-ICK-568
SSE
210
20211201
200
SEK
在我的代码中,我按 rowsortid 进行分组,因为它是唯一不同的行。我的主要兴趣是每个 serial
得到一行,所以在这种情况下输出应该是:
rowsortid
COMPANYID
serial
TRANSDATEID
AMOUNTLC
CURRENCYCODE
20211109-ICJ-564
SSE
222
20211105
-500
SEK
20211109-ICT-562
SSE
202
20211001
600
SEK
20211109-ICK-568
SSE
210
20211201
200
SEK
我的代码:
SELECT rowsortid
,COMPANYID
,REGEXP_SUBSTR(INDIVIDUALCODE, '[^| ]+', 1, 1) as serial
,max(TRANSDATEID)
,sum(AMOUNTLC)
,max(CURRENCYCODE)
FROM generalledger_mgmt
WHERE 1 = 1
AND companyid = 'SSE'
AND transdateid >= 20211101
AND transdateid < 20220101
AND accountno LIKE '3311%'
AND HIERARCHYID LIKE '3311C%'
GROUP BY rowsortid
,COMPANYID
,REGEXP_SUBSTR(INDIVIDUALCODE, '[^| ]+', 1, 1)
ORDER BY REGEXP_SUBSTR(individualcode, '[^| ]+', 1, 1);
您的查询中有一些列不在您的 table 定义中,因此我已删除它们。函数 abs
应该比表示正负序列号相同的正则表达式更快。
SELECT rowsortid
,COMPANYID
,ABS(serial) as serial
,max(TRANSDATEID)
,sum(AMOUNTLC)
,max(CURRENCYCODE)
FROM generalledger_mgmt
WHERE 1 = 1
AND companyid = 'SSE'
AND transdateid >= 20211101
AND transdateid < 20220101
GROUP BY rowsortid
,COMPANYID
,ABS(serial)
ORDER BY ABS(serial);
rowsortid | COMPANYID | serial | max(TRANSDATEID) | sum(AMOUNTLC) | max(CURRENCYCODE)
:--------------- | :-------- | -----: | :--------------- | ------------: | :----------------
20211109-ICK-568 | SSE | 210 | 20211201 | 200 | SEK
20211109-ICJ-565 | SSE | 222 | 20211101 | 500 | SEK
20211109-ICJ-564 | SSE | 222 | 20211105 | -500 | SEK
db<>fiddle here
如果您只希望每个 ID 一行,则它必须是分组依据中的唯一列
create table generalledger_mgmt (
rowsortid varchar(25),
COMPANYID varchar(5),
serial int,
TRANSDATEID varchar(25),
AMOUNTLC int,
CURRENCYCODE varchar(5)
);
insert into generalledger_mgmt values
('20211109-ICJ-565','SSE',222,'20211101', 500,'SEK'),
('20211109-ICJ-564','SSE',222,'20211105',-500,'SEK'),
('20211109-ICT-562','SSE',202,'20211001', 600,'SEK'),
('20211109-ICK-568','SSE',210,'20211201', 200,'SEK');
✓
✓
SELECT
MAX(rowsortid)
,COMPANYID
,MAX(REGEXP_SUBSTR(serial, '[^| ]+', 1, 1)) as serial
,max(TRANSDATEID)
,sum(AMOUNTLC)
,max(CURRENCYCODE)
FROM generalledger_mgmt
WHERE 1 = 1
AND companyid = 'SSE'
AND transdateid >= 20211101
AND transdateid < 20220101
GROUP BY
COMPANYID
ORDER BY MAX(REGEXP_SUBSTR
(serial, '[^| ]+', 1, 1));
MAX(rowsortid) | COMPANYID | serial | max(TRANSDATEID) | sum(AMOUNTLC) | max(CURRENCYCODE)
:--------------- | :-------- | :----- | :--------------- | ------------: | :----------------
20211109-ICK-568 | SSE | 222 | 20211201 | 200 | SEK
db<>fiddle here
我有一个名为 generalledger_mgmt
的 table,其中包含许多列。我编写了查询来执行一些操作,select 其中一些如下所示。
我的问题是其中一些行重复(有时符号不同,有时符号相同,但无论如何,对于我的报告,我认为它们是重复的)并且我只想检索其中一行(可以是最后一个还是第一个对我来说并不重要,只要我每个'serial
') 得到一行 - 我怎样才能调整我的代码来实现它?
table:
rowsortid | COMPANYID | serial | TRANSDATEID | AMOUNTLC | CURRENCYCODE |
---|---|---|---|---|---|
20211109-ICJ-565 | SSE | 222 | 20211101 | 500 | SEK |
20211109-ICJ-564 | SSE | 222 | 20211105 | -500 | SEK |
20211109-ICT-562 | SSE | 202 | 20211001 | 600 | SEK |
20211109-ICK-568 | SSE | 210 | 20211201 | 200 | SEK |
在我的代码中,我按 rowsortid 进行分组,因为它是唯一不同的行。我的主要兴趣是每个 serial
得到一行,所以在这种情况下输出应该是:
rowsortid | COMPANYID | serial | TRANSDATEID | AMOUNTLC | CURRENCYCODE |
---|---|---|---|---|---|
20211109-ICJ-564 | SSE | 222 | 20211105 | -500 | SEK |
20211109-ICT-562 | SSE | 202 | 20211001 | 600 | SEK |
20211109-ICK-568 | SSE | 210 | 20211201 | 200 | SEK |
我的代码:
SELECT rowsortid
,COMPANYID
,REGEXP_SUBSTR(INDIVIDUALCODE, '[^| ]+', 1, 1) as serial
,max(TRANSDATEID)
,sum(AMOUNTLC)
,max(CURRENCYCODE)
FROM generalledger_mgmt
WHERE 1 = 1
AND companyid = 'SSE'
AND transdateid >= 20211101
AND transdateid < 20220101
AND accountno LIKE '3311%'
AND HIERARCHYID LIKE '3311C%'
GROUP BY rowsortid
,COMPANYID
,REGEXP_SUBSTR(INDIVIDUALCODE, '[^| ]+', 1, 1)
ORDER BY REGEXP_SUBSTR(individualcode, '[^| ]+', 1, 1);
您的查询中有一些列不在您的 table 定义中,因此我已删除它们。函数 abs
应该比表示正负序列号相同的正则表达式更快。
SELECT rowsortid ,COMPANYID ,ABS(serial) as serial ,max(TRANSDATEID) ,sum(AMOUNTLC) ,max(CURRENCYCODE) FROM generalledger_mgmt WHERE 1 = 1 AND companyid = 'SSE' AND transdateid >= 20211101 AND transdateid < 20220101 GROUP BY rowsortid ,COMPANYID ,ABS(serial) ORDER BY ABS(serial);
rowsortid | COMPANYID | serial | max(TRANSDATEID) | sum(AMOUNTLC) | max(CURRENCYCODE) :--------------- | :-------- | -----: | :--------------- | ------------: | :---------------- 20211109-ICK-568 | SSE | 210 | 20211201 | 200 | SEK 20211109-ICJ-565 | SSE | 222 | 20211101 | 500 | SEK 20211109-ICJ-564 | SSE | 222 | 20211105 | -500 | SEK
db<>fiddle here
如果您只希望每个 ID 一行,则它必须是分组依据中的唯一列
create table generalledger_mgmt ( rowsortid varchar(25), COMPANYID varchar(5), serial int, TRANSDATEID varchar(25), AMOUNTLC int, CURRENCYCODE varchar(5) ); insert into generalledger_mgmt values ('20211109-ICJ-565','SSE',222,'20211101', 500,'SEK'), ('20211109-ICJ-564','SSE',222,'20211105',-500,'SEK'), ('20211109-ICT-562','SSE',202,'20211001', 600,'SEK'), ('20211109-ICK-568','SSE',210,'20211201', 200,'SEK');
✓ ✓
SELECT MAX(rowsortid) ,COMPANYID ,MAX(REGEXP_SUBSTR(serial, '[^| ]+', 1, 1)) as serial ,max(TRANSDATEID) ,sum(AMOUNTLC) ,max(CURRENCYCODE) FROM generalledger_mgmt WHERE 1 = 1 AND companyid = 'SSE' AND transdateid >= 20211101 AND transdateid < 20220101 GROUP BY COMPANYID ORDER BY MAX(REGEXP_SUBSTR (serial, '[^| ]+', 1, 1));
MAX(rowsortid) | COMPANYID | serial | max(TRANSDATEID) | sum(AMOUNTLC) | max(CURRENCYCODE) :--------------- | :-------- | :----- | :--------------- | ------------: | :---------------- 20211109-ICK-568 | SSE | 222 | 20211201 | 200 | SEK
db<>fiddle here