因此,我使用的是dvdrental DB,我希望在2017年获得最高收入产生员工,指示每个store . 问题是,我得到了所有的员工和他们的收入,但我只需要一个顶级员工每个store . 我也被限制在使用窗口函数.

以下是我的疑问

SELECT staff.first_name, 
        staff.last_name, 
        address.address,
        SUM (payment.amount) AS revenue_generated
FROM payment
INNER JOIN staff ON staff.staff_id = payment.staff_id 
INNER JOIN store ON store.store_id = staff.store_id 
INNER JOIN address ON address.address_id = store.address_id 
WHERE EXTRACT(YEAR FROM payment.payment_date) = 2017
GROUP BY staff.staff_id, address.address_id
ORDER BY revenue_generated DESC;

结果是

Hanna   Carry    28 MySQL Boulevard 79736.45
Hanna   Rainbow  47 MySakila Drive  40537.94
Peter   Lockyard 47 MySakila Drive  40077.97
Jon     Stephens 28 MySQL Boulevard 33927.04
Mike    Hillyer  47 MySakila Drive  33489.47

所以我有点希望它是这样的,不使用limit:

Hanna   Carry    28 MySQL Boulevard 79736.45
Hanna   Rainbow  47 MySakila Drive  40537.94

推荐答案

You can wrap that in a subquery and add a distinct on, to get one record for each store_id. If your primary key names match the foreign key names, you can use the shorter JOIN...USING().
Demo at db<>fiddle:

SELECT DISTINCT ON (store_id) 
       first_name, last_name, address, revenue_generated
FROM (
    SELECT  store_id,
            staff.first_name, 
            staff.last_name, 
            address.address,
            SUM (payment.amount) AS revenue_generated
    FROM payment
    INNER JOIN staff USING (staff_id)
    INNER JOIN store USING (store_id)
    INNER JOIN address USING (address_id)
    WHERE EXTRACT(YEAR FROM payment.payment_date) = 2017
    GROUP BY store.store_id, staff.staff_id, address.address_id) AS subq
ORDER BY store_id, revenue_generated DESC;
first_name last_name address revenue_generated
John Doe Park Ave 1 3000
Tamara Yorke Brooklyn Bvd 2 4000

如果你使用lateral subquery,你的LIMIT的 idea 会奏效,允许每家store 在2017年 for each 员工运行自己的聚合,按降序排列,然后是limit 1.这个限制将分别应用于每个存储的子查询,导致每个存储的子查询只得到一行.

Sql相关问答推荐

如何计算帐户在SQL中随着时间的推移购买的SKU数量?

在SQL中向每个子字节组添加字节行

使用SQL/R循环查找邻居

GROUP BY和GROUP_CONCAT用于计算比赛排名

SQL更新,在2个额外的表上使用内部连接

如何转换和汇总行数

如何隐藏聚合JSON数组元素的键

关于Postgres横向联接的谓词

将一个数组反嵌套到另外两个数组SQL中(Athena/presto)

Postgres SQL查询从字符串中获取邮箱地址

如何使用SQL生成数据的滚动3天总和

使用 Oracle SQL Developer 将不同的列值转换为列会导致错误 ORA-01489

根据具有特定值的 ID 创建自定义组

YEAR 函数仍然不可SARGable 吗?

具有多个表 JOINS 的 STRING_AGG 的替代方法 (SQL Server 2016)

Oracle 21c 中的递归查询回顾过go 3 周

在没有订单的情况下,如何生成一个值为0的顾客天数行

Postgresql 需要一个查询,为我提供所有没有具有特定状态值的子元素的父母

更新表 A,然后将新值插入表 B(包含更新内容的历史日志(log))

如何在一个存储过程中创建全局临时表,并在另一个存储过程中使用它