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)
我正在使用 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)