选择不在GROUP BY子句中的列

时间:2014-07-30 20:50:22

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

我需要有关如何执行SQL查询的建议,我返回了以下内容: 我有2个表:客户和部门

SELECT a.id, a.first_name, a.last_name, MIN (b.income), b.department
/* --b.department can not be in a GROUP BY clause, 
   --but I need to know which department has the
   --smallest income, i.e. which department is responsible for MIN (b.income) */
FROM CUSTOMERS a
INNER JOIN department b
ON a.id = b.id
GROUP BY a.id, a.first_name, a.last_name;

我该怎么做?

4 个答案:

答案 0 :(得分:1)

您可以使用PostgreSQL特有的功能distinct on来执行此操作:

SELECT distinct on (a.id, a.first_name, a.last_name) 
     a.id, a.first_name, a.last_name, b.income, b.department
FROM CUSTOMERS a
INNER JOIN department b
ON a.id = b.id
ORDER BY a.id, a.first_name, a.last_name, b.income;

这意味着您为distinct on (...)中的每组不同值获取一行,并且您获得的该行中的哪一行是该组中的第一行(由order by确定)< / p>

答案 1 :(得分:0)

这看起来像T-SQL所以我会给出答案。

SELECT a.id,
       a.first_name,
       a.last_name,
       MIN(b.income),
       (SELECT TOP 1 c.departmentname --Or whatever the name of your department name is
        FROM department c
        WHERE c.income = MIN(b.income)) AS [DepartmentName]
FROM CUSTOMERS a
INNER JOIN department b ON a.id = b.id
GROUP BY a.id, a.first_name, a.last_name;

您需要使用嵌套查询才能找到哪个部门有收入。假设多个部门可以拥有相同的收入,您可能还需要在嵌套查询中添加更多where限制。但这些将取决于您的数据库架构,所以我将让您解决这个逻辑,以确保您正在讨论相同的逻辑。

修改

虽然阅读更多内容,但看起来你可以改写一下:

SELECT a.id,
       a.first_name,
       a.last_name,
       (SELECT TOP 1 departmentname --Or whatever the name of your department name is
        FROM department
        WHERE department.id = customers.id
        ORDER BY income DESC) AS [DepartmentName]
FROM customers

你不会得到那个收入,但是你也可以添加代码来获得收入。

答案 2 :(得分:0)

在T-SQL(和PL / SQL以及大多数RDBMS中)中,您可以使用OVER子句(窗口):

SELECT a.id, a.first_name, a.last_name,
-- Here is the trick
MIN (b.income) OVER (PARTITION BY a.id, a.first_name, a.last_name) AS min_income,
-- End of trick
b.department
FROM CUSTOMERS a
INNER JOIN department b
ON a.id = b.id

答案 3 :(得分:-1)

这样的东西
Select cust.*, b.department from
(SELECT a.id, a.first_name, a.last_name, MIN (b.income) min_income
FROM CUSTOMERS a
GROUP BY a.id, a.first_name, a.last_name
) cust
INNER JOIN department b
ON cust.id = b.id

如果您的数据库支持此语法。