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 可以满足您的需求。

我在猜测 RARAD 中的数据是什么样的,但这里有一个例子:

创建并加载测试表(对于某些 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