2013-07-17 2 views
0

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

Я попрошу пример, а не описание.

У меня есть таблица под названием user_sale

id emp_id emp_name emp_location date sales 
------------------------------------------------------ 
1 111 mr.one A   2013/07/17 5000 
2 111 mr.one C   2013/07/14 6000 
3 222 mr.two B   2013/06/15 5500 

и так далее.

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

ожидается выход:

id emp_id emp_name emp_location date sales 
------------------------------------------------------ 
1 111 mr.one A   2013/07/17 5000 
2 111 mr.one A   2013/07/14 6000 
3 222 mr.two B   2013/06/15 5500 

Одно решение присоединиться к одной и той же таблицы, но так как таблица содержит много данных не кажется, как правильное решение.

+0

Вы не должны бояться присоединиться к SQL, SQL предназначен для быстрого соединения. – Hogan

+1

Вы забыли: версия Postgres, определение таблицы, как вы получаете с '\ d' в psql. –

ответ

0

Используйте window function first_value(), чтобы получить «первый» из одного столбца (emp_location), как это определено другой столбец (date), встроенный в противном случае неизменных строк:

SELECT id, emp_id, emp_name 
    , first_value(emp_location) OVER (PARTITION BY emp_id 
             ORDER BY date DESC) AS emp_location 
    , date, sales 
FROM user_sale 
ORDER BY id; 

Если предположить, что emp_id уникален для каждой группы, как вы определите его.

Кроме того, вы не должны использовать date (reserved word in SQL standard) или id (не описательный) в качестве имен столбцов.

+0

Спасибо, Это сработало для меня .. – compyutech

0

Вы можете использовать оконную функцию, как это, чтобы получить последние данные по каждому сотруднику:

SELECT * 
FROM 
    (SELECT *, 
      row_number() OVER (PARTITION BY emp_name ORDER BY date_sales DESC) AS pos 
    FROM user_sale 
) AS rankem 
WHERE pos = 1; 

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