Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 返回多行的最小函数_Sql_Oracle_Min - Fatal编程技术网

Sql 返回多行的最小函数

Sql 返回多行的最小函数,sql,oracle,min,Sql,Oracle,Min,我使用以下查询,但它仍然返回按句点分组的行。如果我删除任何GROUPBY字段,它会说不是GROUPBY函数。 我一直在研究分析函数,但它仍然返回多行,如果它能工作的话。 谢谢 您正在按余额和分组,余额和在子查询中按期间分组。将Select语句更改为: select AB1.ID, AB1.NAME, AB1.ACCOUNT_BALANCE, AB1.DELINQUENCY, AB1.DELINQUENCY_DESC,

我使用以下查询,但它仍然返回按句点分组的行。如果我删除任何GROUPBY字段,它会说不是GROUPBY函数。 我一直在研究分析函数,但它仍然返回多行,如果它能工作的话。 谢谢


您正在按余额和分组,余额和在子查询中按期间分组。将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