min 函数返回多行
min Function returning multiple rows
我正在使用以下查询,但它仍然 returns 按句点分组的行。如果我消除任何分组依据字段,它会说不是分组依据功能。
我一直在研究分析函数,但它仍然 returns 多行,如果它可以工作的话。
谢谢!
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
RECEIVABLE_ACCOUNT.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.PERIOD,
AB1.bal_sum
Order by 2,6 asc
这是我的结果:
|ID |NAME |ACCOUNT_BALANCE |DELINQUENCY |DELINQUENCY_DESC |OLDEST_TERM |BAL_SUM
--- --- --- --- --- --- ---
|111 |Tom |500 |AA |D1 |201010 |500
|222 |Dick |501 |AA |D1 |201110 |250
|222 |Dick |501 |AA |D1 |201190 |251
|333 |Harry |600 |BB |D2 |201690 |600
|444 |Jane |601 |AA |D1 |200510 |101
|444 |Jane |601 |AA |D1 |200690 |500
|555 |Sally |700 |AA |D1 |200890 |340
|555 |Sally |700 |AA |D1 |200910 |360
您正在按 bal_sum 分组,它在您的子查询中按 Period 分组。将您的 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
并在末尾从分组依据中删除 bal_sum
如果我对您的目标的理解正确,您希望每个拖欠帐户 id
一行,其中包括该帐户的最早时期,并且您希望包括 bal_sum
来自那个时期(仅)。
如果是这样的话,也许 KEEP
可以满足您的需求。
我在猜测 RA
和 RAD
中的数据是什么样的,但这里有一个例子:
创建并加载测试表(对于某些 RA
条记录有多个 RAD
条记录,以及一个未拖欠且预计不会出现在结果中的新用户 Benedetto:
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);
运行 原始查询(RECEIVABLE_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;
结果:
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
要仅获取最旧的 period
,以及 bal_sum
,我们可以应用 KEEP
。这将获取最旧的 period
并为其拉入相应的 bal_sum
(s),如果有平局(最旧的 period
有多个 bal_sum
,它将解决MIN
的领带。从这些数据来看,我认为不需要任何聚合解析)
如果我们将查询改为 KEEP
,我们现在每个 ID
只得到一行。该行具有最旧的 period
和那个时期的 bal_sum
。例如,Jane 最早的经期是 200510,bal_sum
是 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;
结果:
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
我正在使用以下查询,但它仍然 returns 按句点分组的行。如果我消除任何分组依据字段,它会说不是分组依据功能。 我一直在研究分析函数,但它仍然 returns 多行,如果它可以工作的话。 谢谢!
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
RECEIVABLE_ACCOUNT.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.PERIOD,
AB1.bal_sum
Order by 2,6 asc
这是我的结果:
|ID |NAME |ACCOUNT_BALANCE |DELINQUENCY |DELINQUENCY_DESC |OLDEST_TERM |BAL_SUM
--- --- --- --- --- --- ---
|111 |Tom |500 |AA |D1 |201010 |500
|222 |Dick |501 |AA |D1 |201110 |250
|222 |Dick |501 |AA |D1 |201190 |251
|333 |Harry |600 |BB |D2 |201690 |600
|444 |Jane |601 |AA |D1 |200510 |101
|444 |Jane |601 |AA |D1 |200690 |500
|555 |Sally |700 |AA |D1 |200890 |340
|555 |Sally |700 |AA |D1 |200910 |360
您正在按 bal_sum 分组,它在您的子查询中按 Period 分组。将您的 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
并在末尾从分组依据中删除 bal_sum
如果我对您的目标的理解正确,您希望每个拖欠帐户 id
一行,其中包括该帐户的最早时期,并且您希望包括 bal_sum
来自那个时期(仅)。
如果是这样的话,也许 KEEP
可以满足您的需求。
我在猜测 RA
和 RAD
中的数据是什么样的,但这里有一个例子:
创建并加载测试表(对于某些 RA
条记录有多个 RAD
条记录,以及一个未拖欠且预计不会出现在结果中的新用户 Benedetto:
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);
运行 原始查询(RECEIVABLE_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;
结果:
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
要仅获取最旧的 period
,以及 bal_sum
,我们可以应用 KEEP
。这将获取最旧的 period
并为其拉入相应的 bal_sum
(s),如果有平局(最旧的 period
有多个 bal_sum
,它将解决MIN
的领带。从这些数据来看,我认为不需要任何聚合解析)
如果我们将查询改为 KEEP
,我们现在每个 ID
只得到一行。该行具有最旧的 period
和那个时期的 bal_sum
。例如,Jane 最早的经期是 200510,bal_sum
是 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;
结果:
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