SQL 获取每个服务员的最大账单 ID

SQL get id of max bill per waiter

我正在使用 PostgreSQL 数据库,并且有两个 table 类似

waiters (id, name)

bills (id, amount, id_waiter)

我正在寻找每个服务员最大金额的账单 ID。

我找到了以下解决方案

SELECT waiter.id AS waiter, maxamount, bills.id AS bill
FROM waiter
JOIN (
  SELECT id_waiter, max(amount) AS maxamount
  FROM bills
  GROUP BY id_waiter) AS maxis ON maxis.id_waiter = waiter.id
JOIN bills ON maxis.maxamount = bills.amount AND waiter.id =     bills.id_kellner

有效,但似乎有点多余,我想知道是否有更好的方法来做到这一点。我不喜欢的是 bills 连接了两次,一次在子查询中,一次在末尾。

这是一些示例数据

示例数据

服务员table

id | name
1 | john
2 | joe

账单table

id | amount | id_waiter
1 | 20 | 1
2 | 25 | 2
3 | 50 | 2
4 | 20 | 1
5 | 60 | 1
6 | 10 | 2

结果如下所示

waiter | maxamount | bill
1 | 60 | 5
2 | 50 | 3

在 Postgres 中你可以使用 DISTINCT ON:

select distinct on(id_waiter) id_waiter, amount max_amount, id bill
from bills
order by 1, 2 desc;

 id_waiter | max_amount | bill 
-----------+------------+------
         1 |         60 |    5
         2 |         50 |    3
(2 rows)    

事实上,如果您也想 select 服务员的名字,join 是必要的:

select id_waiter, name, max_amount, bill
from (
    select distinct on(id_waiter) id_waiter, amount max_amount, id bill
    from bills
    order by 1, 2 desc
    ) sub
join waiters w on w.id = id_waiter;

 id_waiter | name | max_amount | bill 
-----------+------+------------+------
         1 | john |         60 |    5
         2 | joe  |         50 |    3
(2 rows)    

SqlFiddle