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,对应的30天的数据,用的pgsql
时间: 2024-02-24 19:58:15 浏览: 28
好的,以下是我基于你的需求优化过的 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) BETWEEN current_date - interval '30 days' AND current_date - interval '1 day' -- 只查昨天有数据的imei,对应的30天的数据
) AS subquery
WHERE row_num <= 30;
```
优化说明:
1. 在子查询中添加了 WHERE 子句,仅查询昨天有数据的 imei,对应的 30 天的数据。
2. 使用了 date_trunc 函数将 date 字段的时间部分截断,只保留日期部分,然后通过 BETWEEN 运算符筛选出最近 30 天的数据。
3. 为了更好的性能,使用了 current_date 函数获取当前日期,避免在 SQL 中使用字符串拼接。
4. 最后在 WHERE 子句中使用 row_num 进行分页,只查询前 30 行数据。
相关问题
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
好的,基于你的需求,以下是我优化过的 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 >= DATEADD(day, -1, CONVERT(DATE, GETDATE())) -- 只查昨天有数据的
) AS subquery
WHERE row_num <= 30
```
优化说明:
1. 在原有 SQL 的基础上,在子查询中添加了 WHERE 子句,仅查询昨天有数据的 imei。
2. 使用了 GETDATE() 函数获取当前时间,CONVERT(DATE, GETDATE()) 将当前时间转换为日期格式,再使用 DATEADD(day, -1, CONVERT(DATE, GETDATE())) 得到昨天的日期。
3. 在 WHERE 子句中使用 date >= 昨天的日期,只查询昨天有数据的 imei。
select *, row_number()over(partition by id order by salary desc) ranking
这是一个使用`row_number()`函数和`over()`子句的SQL查询语句,用于在每个id分组中按照salary降序排列,并为每个分组中的行分配一个排名。下面是两个例子:
引用的例子:
```sql
with t as (
select *, row_number() over(partition by id order by salary desc) ranking
from tmp_learning_mary
)
select * from t where ranking = 1;
```
这个例子使用了一个公共表表达式(CTE)`t`,在其中使用`row_number()`函数为每个id分组中的行分配了一个排名。然后,查询选择了排名为1的行,即每个分组中的最高薪水行。
引用的例子:
```sql
select * from (
select *, row_number() over(partition by id order by rand()) ranking
from tmp_learning_mary
) t where t.ranking = 1;
```
这个例子与引用的例子类似,只是在`order by`子句中使用了`rand()`函数,它会随机排序每个分组中的行。然后,查询选择了排名为1的行,即每个分组中的随机行。