选择具有条件的列,其中包含其他列

时间:2013-07-17 02:55:50

标签: sql postgresql greatest-n-per-group

在询问之前我没有经常搜索过,因为我感觉搜索字符串很复杂。

我会通过例子而不是描述来询问。

我有一个名为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

一种解决方案是使用同一个表连接,但由于该表包含大量数据,因此它似乎不是一个合适的解决方案。

2 个答案:

答案 0 :(得分: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;

我不太清楚你想要什么,但我想你可以加入那个子查询来获得你需要的东西。

答案 1 :(得分: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在您定义时每个组都是唯一的。

除此之外:您不应该使用datereserved word in SQL standard)或id(非描述性)作为列名。