【问题标题】:Add additional value to the newest record (but show all records)为最新记录添加附加值(但显示所有记录)
【发布时间】:2020-08-12 12:06:41
【问题描述】:
我必须在 MariaDB 中创建包含来自states 表的所有数据的视图:
| id | user_id | state |
但是到每个用户的最新记录(基于每个用户的最高状态 id)。我还必须添加列is_newest 并将其设置为 true (1) - 其余记录应为 false (0)。
这可以在查询中做到吗?
【问题讨论】:
标签:
mysql
sql
mariadb
greatest-n-per-group
sql-view
【解决方案1】:
如果您运行的是 MariaDB 10.3 或更高版本,则可以使用row_number():
create view states_view as
select
id,
user_id,
state,
(row_number() over(partition by user_id order by id desc) = 1) is_newest
from states
在早期版本中,窗口函数不可用,一个选项是加入聚合查询:
create view states_view as
select
s.id,
s.user_id,
s.state,
(s.id = m.max_id) is_newest
from states s
inner join (select user_id, max(id) max_id from states group by user_id) m
on m.user_id = s.user_id
【解决方案2】:
你可以用 NOT EXISTS 做到这一点:
select s.*,
(not exists(select 1 from states where user_id = s.user_id and id > s.id)) is_newest
from states s
查看简化的demo。