ORACLE SQL 按数字仅选择每组中的 MAX

Posted

技术标签:

【中文标题】ORACLE SQL 按数字仅选择每组中的 MAX【英文标题】:ORACLE SQL Select only MAX of each group by number 【发布时间】:2016-11-11 13:37:22 【问题描述】:

我在为给定期间的特定 Acc、Nam 选择余额总和时遇到问题。

SELECT Acc, Nam, SUM(Bal) FROM table WHERE
MAX(Par) = (SELECT Par WHERE Acc IN (101,102) AND Dat >1105 AND Dat <1405)
AND Acc IN (101,102) AND Dat >1105 AND Dat <1405
GROUP BY Acc, Nam


Acc --- Nam --- Bal --- Par --- Dat
101 --- One --- 150 --- 131 --- 1205
101 --- One --- 120 --- 132 --- 1205
101 --- One --- 160 --- 133 --- 1305
102 --- Two --- 190 --- 121 --- 1205
102 --- Two --- 110 --- 122 --- 1305
102 --- Two --- 150 --- 123 --- 1305

最终的输出应该是:

Acc --- Nam --- Bal
101 --- One --- 280
102 --- Two --- 340

因此,它将汇总由帐户和帐户名称分隔的期间内的所有余额。只有每天最高面值的余额才应合计。请指教。

更新

我用下面的 row_number 方法做到了,但我收到的只是所有行的总数(没有其中一些)。下面是显示的代码:两个帐户,两个帐户描述,参数,日期和余额。我想看到两行,它们将是给定帐户范围内所有日期的总和,在单独的一天中具有最高参数编号。最终输出应该只有三列:account、name 和 balance。此查询应该能够选择每天的最大参数并将所有这些最大值汇总到一个帐户。

 SELECT h.account, h.name, h.paramet, h.date, h.balance 
    FROM h
    WHERE TRUNC(h.date) > '01-Jun-16' AND TRUNC(h.date) < '10-Jun-16' 
    AND h.account IN ('410212','410213') 
    AND h.fund LIKE 'SSPSP

【问题讨论】:

你是说这不起作用:SELECT Acc, Nam, SUM(Bal) FROM table WHERE Acc IN (101,102) AND Dat >1105 AND Dat MAX() 不能放在 WHERE 语句中,但可以放在 HAVING 子句中,该子句是在分组和聚合之后确定的。 Next (SELECT Par WHERE Acc IN (101,102) AND Dat >1105 AND Dat @Matt 输入查询应该是:` SELECT h.account, h.name, h.paramet, h.date, h.balance FROM h WHERE TRUNC(h.date) > '01-Jun -16' AND TRUNC(h.date) @JayKumarR 它在整个期间显示具有最大参数的行 - 不是每天 【参考方案1】:

我有与上述查询相关的下一个问题。如何创建一个包含两个 SUM(Bal) 列且日期不同的表:

Acc --- Nam --- Bal(Dat1) -- Bal(Dat2) 101 --- 一个 ------- 280 ---------- 300 102 --- 两个 ------- 340 ---------- 180

SELECT Acc, Nam, SUM(Bal)
FROM (SELECT t.*,
             ROW_NUMBER() OVER (PARTITION BY Acc, Nam, TRUNC(Dat) ORDER BY Par DESC) as seqnum
      FROM table t
      WHERE Acc IN (101,102) AND Dat = 1105 
     ) t
WHERE seqnum = 1
GROUP BY Acc, Nam;

SELECT Acc, Nam, SUM(Bal)
FROM (SELECT t.*,
             ROW_NUMBER() OVER (PARTITION BY Acc, Nam, TRUNC(Dat) ORDER BY Par DESC) as seqnum
      FROM table t
      WHERE Acc IN (101,102) AND Dat = 1405
     ) t
WHERE seqnum = 1
GROUP BY Acc, Nam;

【讨论】:

【参考方案2】:

您可以为此使用row_number()

SELECT Acc, Nam, SUM(Bal)
FROM (SELECT t.*,
             ROW_NUMBER() OVER (PARTITION BY Acc, Nam, Dat ORDER BY Par DESC) as seqnum
      FROM table t
      WHERE Acc IN (101,102) AND Dat > 1105 AND Dat < 1405
     ) t
WHERE seqnum = 1
GROUP BY Acc, Nam;

【讨论】:

无法编辑此内容以删除重复的 FROM,因为编辑内容为 @RobGudgeon 。 . .谢谢。 @GordonLinoff - 谢谢,但此查询显示的是同一帐户中每天几乎所有行的总和,但不显示具有 max 参数的行的总和。 @GordonLinoff 我再次检查了它 - 我在 PARTITION BY 之后忘记了 Dat 字段中的 TRUNC ,因此还包括时间。谢谢。

以上是关于ORACLE SQL 按数字仅选择每组中的 MAX的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Oracle 的组中获得第三个 [重复]

SQLite:仅返回每组中的前 2 个结果

分组问题,32个数分8组,每组中数不能有相同的,请用python编程?

从每组中的 3 个表中选择 sql 中具有最新日期的行

SQL - 组中的 Max() 值不起作用

sql按字段分组,排序,并且找出每组最大的数据