Sql 返回多行的最小函数
我使用以下查询,但它仍然返回按句点分组的行。如果我删除任何GROUPBY字段,它会说不是GROUPBY函数。 我一直在研究分析函数,但它仍然返回多行,如果它能工作的话。 谢谢Sql 返回多行的最小函数,sql,oracle,min,Sql,Oracle,Min,我使用以下查询,但它仍然返回按句点分组的行。如果我删除任何GROUPBY字段,它会说不是GROUPBY函数。 我一直在研究分析函数,但它仍然返回多行,如果它能工作的话。 谢谢 您正在按余额和分组,余额和在子查询中按期间分组。将Select语句更改为: select AB1.ID, AB1.NAME, AB1.ACCOUNT_BALANCE, AB1.DELINQUENCY, AB1.DELINQUENCY_DESC,
您正在按余额和分组,余额和在子查询中按期间分组。将Select语句更改为:
select
AB1.ID,
AB1.NAME,
AB1.ACCOUNT_BALANCE,
AB1.DELINQUENCY,
AB1.DELINQUENCY_DESC,
min(AB1.PERIOD) as oldest_per_owed,
sum(AB1.bal_sum) as bal_sum
如果我正确理解您的目标,您希望每个拖欠帐户
id
,其中包括该帐户最早的期间,并且您希望包括该期间的bal\u sum
,最后将bal\u sum从组中删除
如果是这样,也许KEEP
能满足您的需求
我在猜测RA
和RAD
中的数据是什么样子的,但下面是一个示例:
创建并加载测试表(一些RA
记录有多个RAD
记录,一个新用户benedeto未拖欠且不希望出现在结果中):
运行原始查询(将应收账款_ACCOUNT.ID
更改为RA.ID
等)会得到与示例中的八行类似的结果:
SELECT
AB1.ID,
AB1.NAME,
AB1.ACCOUNT_BALANCE,
AB1.DELINQUENCY,
AB1.DELINQUENCY_DESC,
min(AB1.PERIOD) AS OLDEST_PER_OWED,
AB1.BAL_SUM
FROM
(SELECT
RA.ID,
RA.NAME,
RA.ACCOUNT_BALANCE,
RA.DELINQUENCY,
RA.DELINQUENCY_DESC,
RAD.PERIOD,
sum(RAD.BALANCE) AS BAL_SUM
FROM RAD RAD,
RA RA
WHERE (RA.ID = RAD.ID)
AND (RA.DELINQUENCY IN ('02', '03', '05'))
AND (RA.BALANCE > 0
OR
RAD.BALANCE < 0)
GROUP BY
RA.ID,
RA.NAME,
RA.ACCOUNT_BALANCE,
RA.DELINQUENCY,
RA.DELINQUENCY_DESC,
RAD.PERIOD
ORDER BY RA.NAME) AB1
GROUP BY
AB1.ID,
AB1.NAME,
AB1.ACCOUNT_BALANCE,
AB1.DELINQUENCY,
AB1.DELINQUENCY_DESC,
AB1.BAL_SUM
ORDER BY 1, 6 ASC;
要仅获取最早的期间
,以及该期间的余额和
,我们可以应用保留
。这将抓取最早的时段
,并为其拉入相应的余额和
,如果存在平局(最早的时段
有多个余额和
,它将在分钟
之前解决平局。从这些数据的外观来看,我认为不需要任何聚合解决方案)
如果我们将查询改为KEEP
,那么现在每个ID
只能得到一行。此行包含最早的期间
,以及该期间的余额和
。例如,Jane最早的时期是200510,余额为101
SELECT
AB1.ID,
AB1.NAME,
AB1.ACCOUNT_BALANCE,
AB1.DELINQUENCY,
AB1.DELINQUENCY_DESC,
min(AB1.PERIOD) AS OLDEST_PER_OWED,
MIN(AB1.BAL_SUM) KEEP (DENSE_RANK FIRST ORDER BY AB1.PERIOD ASC) AS OLDEST_PER_BAL_SUM
FROM
(SELECT
RA.ID,
RA.NAME,
RA.ACCOUNT_BALANCE,
RA.DELINQUENCY,
RA.DELINQUENCY_DESC,
RAD.PERIOD,
sum(RAD.BALANCE) AS BAL_SUM
FROM RAD RAD,
RA RA
WHERE (RA.ID = RAD.ID)
AND (RA.DELINQUENCY IN ('02', '03', '05'))
AND (RA.BALANCE > 0
OR
RAD.BALANCE < 0)
GROUP BY
RA.ID,
RA.NAME,
RA.ACCOUNT_BALANCE,
RA.DELINQUENCY,
RA.DELINQUENCY_DESC,
RAD.PERIOD
ORDER BY RA.NAME) AB1
GROUP BY
AB1.ID,
AB1.NAME,
AB1.ACCOUNT_BALANCE,
AB1.DELINQUENCY,
AB1.DELINQUENCY_DESC
ORDER BY 1, 6 ASC;
您还应该标记正在使用的dbms。@vkp谢谢。好了,谢谢林迪。如果能看到一些数据来重现这个问题,那就太好了。有没有可能包括几行
RA
和RAD
来说明问题?感谢hanks@Lyndey提供更新的数据。我添加了一个答案,试图符合您提供的示例数据,但不得不猜测RA
和RAD
应该是什么样子。如果误解了RA
和RAD
的外观(或此处的目标),可能添加更多RA
和RAD
数据也有助于澄清。谢谢谢谢,但这给了我账户的总余额,而不是最旧的余额。谢谢@Lyndey很高兴听到。如果我能提供任何澄清,请告诉我。另外,如果这个帖子(或另一个)已经回答了你的问题,请考虑接受答案;这有助于对问题进行分类。谢谢
CREATE TABLE RAD (
ID NUMBER,
"PERIOD" NUMBER,
BALANCE NUMBER
);
INSERT INTO RAD VALUES (111, 201010, 500);
INSERT INTO RAD VALUES (222, 201010, 120);
INSERT INTO RAD VALUES (222, 201010, 130);
INSERT INTO RAD VALUES (222, 201190, 101);
INSERT INTO RAD VALUES (222, 201190, 150);
INSERT INTO RAD VALUES (333, 201690, 600);
INSERT INTO RAD VALUES (444, 200510, 101);
INSERT INTO RAD VALUES (444, 200690, 500);
INSERT INTO RAD VALUES (555, 200890, 340);
INSERT INTO RAD VALUES (555, 200910, 360);
INSERT INTO RAD VALUES (666, 200911, 200);
CREATE TABLE RA (
ID NUMBER,
NAME VARCHAR2(256),
ACCOUNT_BALANCE NUMBER,
DELINQUENCY VARCHAR2(3),
DELINQUENCY_DESC VARCHAR2(256),
BALANCE NUMBER
);
INSERT INTO RA VALUES (111, 'Tom',500,'02','D2',1);
INSERT INTO RA VALUES (222, 'Dick',501,'03','D3',1);
INSERT INTO RA VALUES (333, 'Harry',600,'05','D5',1);
INSERT INTO RA VALUES (444, 'Jane',600,'02','D2',1);
INSERT INTO RA VALUES (555, 'Sally',600,'03','D3',1);
INSERT INTO RA VALUES (666, 'Benedetto',23,'03','D3',-20);
SELECT
AB1.ID,
AB1.NAME,
AB1.ACCOUNT_BALANCE,
AB1.DELINQUENCY,
AB1.DELINQUENCY_DESC,
min(AB1.PERIOD) AS OLDEST_PER_OWED,
AB1.BAL_SUM
FROM
(SELECT
RA.ID,
RA.NAME,
RA.ACCOUNT_BALANCE,
RA.DELINQUENCY,
RA.DELINQUENCY_DESC,
RAD.PERIOD,
sum(RAD.BALANCE) AS BAL_SUM
FROM RAD RAD,
RA RA
WHERE (RA.ID = RAD.ID)
AND (RA.DELINQUENCY IN ('02', '03', '05'))
AND (RA.BALANCE > 0
OR
RAD.BALANCE < 0)
GROUP BY
RA.ID,
RA.NAME,
RA.ACCOUNT_BALANCE,
RA.DELINQUENCY,
RA.DELINQUENCY_DESC,
RAD.PERIOD
ORDER BY RA.NAME) AB1
GROUP BY
AB1.ID,
AB1.NAME,
AB1.ACCOUNT_BALANCE,
AB1.DELINQUENCY,
AB1.DELINQUENCY_DESC,
AB1.BAL_SUM
ORDER BY 1, 6 ASC;
ID NAME ACCOUNT_BALANCE DELINQUENCY DELINQUENCY_DESC OLDEST_PER_OWED BAL_SUM
111 Tom 500 02 D2 201010 500
222 Dick 501 03 D3 201010 250
222 Dick 501 03 D3 201190 251
333 Harry 600 05 D5 201690 600
444 Jane 600 02 D2 200510 101
444 Jane 600 02 D2 200690 500
555 Sally 600 03 D3 200890 340
555 Sally 600 03 D3 200910 360
SELECT
AB1.ID,
AB1.NAME,
AB1.ACCOUNT_BALANCE,
AB1.DELINQUENCY,
AB1.DELINQUENCY_DESC,
min(AB1.PERIOD) AS OLDEST_PER_OWED,
MIN(AB1.BAL_SUM) KEEP (DENSE_RANK FIRST ORDER BY AB1.PERIOD ASC) AS OLDEST_PER_BAL_SUM
FROM
(SELECT
RA.ID,
RA.NAME,
RA.ACCOUNT_BALANCE,
RA.DELINQUENCY,
RA.DELINQUENCY_DESC,
RAD.PERIOD,
sum(RAD.BALANCE) AS BAL_SUM
FROM RAD RAD,
RA RA
WHERE (RA.ID = RAD.ID)
AND (RA.DELINQUENCY IN ('02', '03', '05'))
AND (RA.BALANCE > 0
OR
RAD.BALANCE < 0)
GROUP BY
RA.ID,
RA.NAME,
RA.ACCOUNT_BALANCE,
RA.DELINQUENCY,
RA.DELINQUENCY_DESC,
RAD.PERIOD
ORDER BY RA.NAME) AB1
GROUP BY
AB1.ID,
AB1.NAME,
AB1.ACCOUNT_BALANCE,
AB1.DELINQUENCY,
AB1.DELINQUENCY_DESC
ORDER BY 1, 6 ASC;
ID NAME ACCOUNT_BALANCE DELINQUENCY DELINQUENCY_DESC OLDEST_PER_OWED OLDEST_PER_BAL_SUM
111 Tom 500 02 D2 201010 500
222 Dick 501 03 D3 201010 250
333 Harry 600 05 D5 201690 600
444 Jane 600 02 D2 200510 101
555 Sally 600 03 D3 200890 340