MySql select 每小时第一行,接下来 5 分钟跳过行
MySql select first rows in every hour, skip rows next 5 minutes
我正在尝试 Select 仅从小时开始的第一行作为示例作为日期时间可选每 2 Hours/3Hours
2020-09-30 09:37:04 SELECT
2020-09-30 09:37:04 SELECT
2020-09-30 09:45:04 SKIP
2020-09-30 09:45:04 SKIP
2020-09-30 09:54:04 SKIP
2020-09-30 10:37:04 SELECT
另一方面,我认为有一个解决方案,但它不起作用.. 可能错误等于 VAR?
SET @prev=0;
SELECT `Date`,@prev, @prev:=UNIX_TIMESTAMP(`Date`)
FROM `tab`
WHERE FLOOR(UNIX_TIMESTAMP(`Date`)/3600)%2 AND UNIX_TIMESTAMP(`Date`)= @prev;```
不存在:
select t.* from tab t
where not exists (
select 1 from tab
where date_format(date, '%Y%m%d%H') = date_format(t.date, '%Y%m%d%H')
and date < t.date
)
或使用 RANK() window 函数:
select date
from (
select date,
rank() over (partition by date_format(date, '%Y%m%d%H') order by date) rnk
from tab
) t
where t.rnk = 1
参见demo。
结果:
> | date |
> | :------------------ |
> | 2020-09-30 09:37:04 |
> | 2020-09-30 09:37:04 |
> | 2020-09-30 10:37:04 |
我正在尝试 Select 仅从小时开始的第一行作为示例作为日期时间可选每 2 Hours/3Hours
2020-09-30 09:37:04 SELECT
2020-09-30 09:37:04 SELECT
2020-09-30 09:45:04 SKIP
2020-09-30 09:45:04 SKIP
2020-09-30 09:54:04 SKIP
2020-09-30 10:37:04 SELECT
另一方面,我认为有一个解决方案,但它不起作用.. 可能错误等于 VAR?
SET @prev=0;
SELECT `Date`,@prev, @prev:=UNIX_TIMESTAMP(`Date`)
FROM `tab`
WHERE FLOOR(UNIX_TIMESTAMP(`Date`)/3600)%2 AND UNIX_TIMESTAMP(`Date`)= @prev;```
不存在:
select t.* from tab t
where not exists (
select 1 from tab
where date_format(date, '%Y%m%d%H') = date_format(t.date, '%Y%m%d%H')
and date < t.date
)
或使用 RANK() window 函数:
select date
from (
select date,
rank() over (partition by date_format(date, '%Y%m%d%H') order by date) rnk
from tab
) t
where t.rnk = 1
参见demo。
结果:
> | date |
> | :------------------ |
> | 2020-09-30 09:37:04 |
> | 2020-09-30 09:37:04 |
> | 2020-09-30 10:37:04 |