oracle 11g中的唯一行

时间:2012-04-08 07:10:26

标签: oracle

我有一个查询,它返回一组记录,如下所示: -

Date    Dept        commission

5-Apr   Sales       20
4-Apr   Sales       21
1-Jan   Marketing   35

案例1:如果我在1月1日至5月5日之间运行查询,我应该

Date    Dept        commission

5 April Sales       76

案例2:当我在jan 1和jan 31之间运行查询时,输出应为

Date    Dept        commission

1 Jan   Marketing   35

案例2很简单,因为当我把日期范围得到所需的结果,但不知道如何处理案例1以显示最大/最新日期,该日期的部门和该部门的佣金总和,所选日期范围的日期。输出将是包含最新日期和部门的单行,其中包含所选日期范围的总和(佣金)。

1 个答案:

答案 0 :(得分:3)

SELECT
    MAX(Date)                     AS Date
  , ( SELECT tt.Dept                            
      FROM tableX tt 
      WHERE tt.Date = MAX(t.Date) 
    )                             AS Dept
  , SUM(Commission)               AS Commission
FROM
    tableX t
WHERE
    Date BETWEEN StartDate AND EndDate

上述工作在SQL-Server,MySQL,Postgres中显示为sql-fiddle, test-1,但它在Oracle 11g R2中不起作用!


这虽然有效(sql-fiddle, test-2):

SELECT
    MAX(t.Date)        AS Date
  , MIN(tt.Dept)       AS Dept               --- MIN, MAX irrelevant
  , SUM(t.Commission)  AS Commission
FROM
  ( SELECT
       MAX(Date)                      AS Date
     , SUM(Commission)                AS Commission
    FROM
       tableX 
    WHERE
       Date BETWEEN StartDate AND EndDate
  ) t
  JOIN
    tableX tt
      ON tt.Date = t.Date

MIN(tt.Dept)用于处理您拥有超过最大日期的行的情况,例如Sales的一行和Marketing的一行,{{1} }}

这也可以使用Apr-5分析函数(sql-fiddle, test-3):

LAST_VALUE