mysql - 更改 sql 以摆脱窗口函数
问题描述
我正在尝试在远程 mysql 数据库上创建一个视图,不幸的是,安装的版本(5.7)似乎不支持窗口功能。一切都在我的本地数据库上运行,但现在我有点卡住了。
这是以前的代码:
create or replace view my_view as
(
with a as
(select a.*, DENSE_RANK() over (partition by SHOP order by TIMESTAMP(LOAD_TIME) DESC) rn
from my_table as a)
select row_number() OVER () as id, SHOP, LOAD_TIME from a WHERE a.rn = 1
);
Mysql 5.7 也不支持 CTE,但这不是什么大问题。
任何提示如何解决这个问题?
解决方案
更换dense_rank()
非常容易。但是,更换的row_number()
难度更大。MySQL 不允许视图中的变量。不幸的是,这也使您对行号的子查询效率低下:
select (select count(distinct shop)
from mytable t2
where t2.shop <= t.shop
) as id,
shop, load_time
from mytable t
where t.load_time = (select max(t2.load_time) from mytable t2 where t2.shop = t.shop);
或者,如果这些是您仅有的两列,请使用聚合:
select (select count(distinct shop)
from mytable t2
where t2.shop <= t.shop
) as id,
shop, max(load_time) as load_time
from mytable t
group by shop;
这效率不高。在一个简单的查询中,您可以使用变量:
select (@rn := @rn + 1) as id,
shop, load_time
from mytable t cross join
(select @rn := 0) params
where t.load_time = (select max(t1.load_time) from mytable t1 where t1.shop = t.shop);
如果性能是一个问题,那么您可能希望创建一个表而不是一个视图,并使用触发器使其保持最新。
推荐阅读
- javascript - 如何扩展 axios 以使用 PROPFIND 方法发送请求(Typescript)
- angular - 角度中的表单验证案例
- sql - 表值函数 - 关键字“开始”附近的语法不正确
- javascript - 关闭弹出窗口并打开新窗口
- mongodb - 如何从 Mongodb 视图中导出数据
- sql - 没有为一个或多个必需的 SQL 参数指定值
- ios - 如何实现一个 Firebase 监听器来观察数据库的实时变化
- python - 格式错误的结果以 JSON 格式保存
- c - 打印正确数量的相同字符的问题。C中的RLE
- memory-management - 更改 PTE 中的 PFN 时延迟 Linux 内核恐慌