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