2015-11-09 4 views
1

У меня есть таблица, содержащая идентификаторы сотрудников, идентификатор года, идентификатор клиента и количество продаж. Например:LAG MIN в SQL Analytic

-------------------------------------- 
    id_emp | id_year | sales | client id 
-------------------------------------- 
    4 | 1 | 14 | 1 
    4 | 1 | 10 | 2 
    4 | 2 | 11 | 1 
    4 | 2 | 17 | 2 

Для сотрудника, я хочу, чтобы получить строки с минимальными продаж в год и минимальных продаж предыдущего года.

Один из запросов, я попытался следующий:

select distinct 
    id_emp, 
    id_year, 
    MIN(sales) OVER(partition by id_emp, id_year) AS min_sales, 
    LAG(min(sales), 1) OVER(PARTITION BY id_emp, id_year 
           ORDER BY id_emp, id_year) AS previous 
from facts 
where id_emp = 4 
group by id_emp, id_year, sales; 

Я получаю результат:

-------------------------------------  
    id_emp | id_year | sales | previous 
------------------------------------- 
    4 | 1 | 10 | (null) 
    4 | 1 | 10 | 10 
    4 | 2 | 11 | (null) 

, но я ожидаю, чтобы получить:

------------------------------------- 
    id_emp | id_year | sales | previous 
------------------------------------- 
    4 | 1 | 10 | (null) 
    4 | 2 | 11 | 10 
+1

Вы используете Oracle или Microsoft SQL Server? –

+0

Почему вы разделяете по году функцию LAG, если хотите получить предыдущий год? –

ответ

2

Настройка SQL Fiddle

Oracle 11g R2 Схема:

CREATE TABLE EMPLOYEE_SALES (id_emp, id_year, sales, client_id) AS 
      SELECT 4, 1, 14, 1 FROM DUAL 
UNION ALL SELECT 4, 1, 10, 2 FROM DUAL 
UNION ALL SELECT 4, 2, 11, 1 FROM DUAL 
UNION ALL SELECT 4, 2, 17, 2 FROM DUAL; 

Запрос 1:

SELECT ID_EMP, 
     ID_YEAR, 
     SALES AS SALES, 
     LAG(SALES) OVER (PARTITION BY ID_EMP ORDER BY ID_YEAR) AS PREVIOUS 
FROM (
    SELECT e.*, 
     ROW_NUMBER() OVER (PARTITION BY id_emp, id_year ORDER BY sales) AS RN 
    FROM EMPLOYEE_SALES e 
) 
WHERE rn = 1 

Запрос 2:

SELECT ID_EMP, 
     ID_YEAR, 
     MIN(SALES) AS SALES, 
     LAG(MIN(SALES)) OVER (PARTITION BY ID_EMP ORDER BY ID_YEAR) AS PREVIOUS 
FROM EMPLOYEE_SALES 
GROUP BY ID_EMP, ID_YEAR 

Results - Оба дает один и тот же выход:

| ID_EMP | ID_YEAR | SALES | PREVIOUS | 
|--------|---------|-------|----------| 
|  4 |  1 | 10 | (null) | 
|  4 |  2 | 11 |  10 | 
2

Вы имеете в виду вот так?

select id_emp, id_year, min(sales) as min_sales, 
    lag(min(sales)) over (partition by id_emp order by id_year) as prev_year_min_sales 
from facts 
where id_emp = 4 
group by id_emp, id_year; 
0

Вы можете получить желаемый результат с помощью ROW_NUMBER() и LAG() аналитических функций.

Например,

Таблица

SQL> SELECT * FROM t; 

    ID_EMP ID_YEAR  SALES CLIENT_ID 
---------- ---------- ---------- ---------- 
     4   1   14   1 
     4   1   10   2 
     4   2   11   1 
     4   2   17   2 

Запрос

SQL> WITH DATA AS 
    2 (SELECT t.*, 
    3  row_number() OVER(PARTITION BY id_emp, id_year ORDER BY sales) rn 
    4 FROM t 
    5 ) 
    6 SELECT id_emp, 
    7 id_year , 
    8 sales , 
    9 lag(sales) over(order by sales) previous 
10 FROM DATA 
11 WHERE rn =1; 

    ID_EMP ID_YEAR  SALES PREVIOUS 
---------- ---------- ---------- ---------- 
     4   1   10 
     4   2   11   10 
0

Я считаю, что это происходит потому, что вы используете колонки продаж в вашей группе заявление. Попробуйте удалить его и просто используйте

GROUP BY id_emp,id_year