SELECT * FROM ( SELECT *, ROW_NUMBER() OVER (PARTITION BY imei ORDER BY date desc) AS row_num FROM t_iot_zdjk_gzyj_lsnlb ) AS subquery WHERE row_num <= 30。帮忙优化这个SQL,只查出昨天有数据的imei,用的pgsql
时间: 2024-02-24 15:58:11 浏览: 118
SQL 的 SELECT 语句优化
好的,以下是我基于你的需求优化过的 PostgreSQL SQL 语句:
```
SELECT *
FROM (
SELECT *,
ROW_NUMBER() OVER (PARTITION BY imei ORDER BY date DESC) AS row_num
FROM t_iot_zdjk_gzyj_lsnlb
WHERE date_trunc('day', date) = current_date - interval '1 day' -- 只查昨天有数据的
) AS subquery
WHERE row_num <= 30;
```
优化说明:
1. 在子查询中添加了 WHERE 子句,仅查询昨天有数据的 imei。
2. 使用了 date_trunc 函数将 date 字段的时间部分截断,只保留日期部分,然后与昨天日期进行比较,从而筛选出昨天有数据的 imei。
3. 为了更好的性能,使用了 current_date 函数获取当前日期,减去 1 天得到昨天的日期,避免在 SQL 中使用字符串拼接。
4. 最后在 WHERE 子句中使用 row_num 进行分页,只查询前 30 行数据。
阅读全文