2012-04-08 3 views
-2

У меня есть запрос, который возвращает набор записей, как как показано ниже: -Уникальные строки в Oracle 11g

Date Dept  commission 

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

случай 1: Если я выполнить запрос между 1 января и 5 апреля я должны получить

Date Dept  commission 

5 April Sales  76 

случай 2: и когда я выполнить запрос между 1 января и 31 января должен получить выход, как

Date Dept  commission 

1 Jan Marketing 35 

Случай 2 прост, как, когда я поставил Hte диапазон дат получения требуемых результатов, но не знает, как обращаться корпус 1, чтобы показать максимальную/последнюю дату, Dept на эту дату и сумму комиссия за этот Департамент, укажите выбранный диапазон дат. Результатом будет одна строка с последней датой и отделением с суммой (комиссией) за выбранный диапазон дат.

+1

: Если вы запустили запрос для первого случая, вы должны получить 4april и 5 апреля, а для случая 2 вы должны получить 4 и 5 апреля, но вы результат другой? –

+0

Привет Извините, что это была опечатка с моего конца, она должна быть от 1 января до 31 января –

+0

И откуда взялся этот '71'? @priya: Вы можете отредактировать свой вопрос. –

ответ

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-сервер, 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 как в Apr-5

Это работает также, используя LAST_VALUE аналитическую функцию (sql-fiddle, test-3):

SELECT 
    MAX(Date)  AS Date 
    , MIN(Dept)  AS Dept    
    , SUM(Commission) AS Commission 
FROM 
    (SELECT 
     Date      AS Date 
    , LAST_VALUE(Dept) OVER(ORDER BY Date 
       ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING 
          ) AS Dept 
    , Commission    AS Commission 
    FROM 
     tableX 
    WHERE 
     Date BETWEEN StartDate AND EndDate 
) t 
+0

попробует ваш запрос и ответ. –

+0

Нет, это неправильно. Позвольте мне сначала изменить. –