SQL查询和过滤数据

Posted

技术标签:

【中文标题】SQL查询和过滤数据【英文标题】:SQL Query and filtering data 【发布时间】:2015-09-15 16:58:52 【问题描述】:

我正在使用时区数据库 (https://timezonedb.com/download),但我正在努力处理 SQL 查询。

时区的有效性取决于数据库中的 time_start 字段。这对于获得正确的 time_start 很重要。

以下是数据

zone_id|zone_name          |time_start
391    |America/Los_Angeles|2147397247
391    |America/Los_Angeles|1425808800
391    |America/Los_Angeles|2140678800
391    |America/Los_Angeles|9972000

392    |America/Metlakatla |2147397247
392    |America/Metlakatla |436352400
392    |America/Metlakatla |9972000

393    |America/Anchorage  |2147397247
393    |America/Anchorage  |2140682400
393    |America/Anchorage  |2120122800
393    |America/Anchorage  |1425812400
393    |America/Anchorage  |9979200

下面的例子展示了如何使用时区名称America/Los_Angeles查询时区信息。

SELECT * FROM timezone 
WHERE time_start < strftime('%s', 'now')
AND zone_name='America/Los_Angeles'
ORDER BY time_start DESC LIMIT 1;

这个查询返回

391|America/Los_Angeles|1425808800

我想用一个 SQL 查询对所有 zone_id 做同样的事情。

预期结果

391|America/Los_Angeles|1425808800
392|America/Metlakatla |436352400
393|America/Anchorage  |1425812400

SQL Fiddle

【问题讨论】:

这是一个greatest-n-per-group 问题(其中n 为1)。 @Clockwork-Muse 我不知道它有什么名字。感谢分享:) 【参考方案1】:

我猜你正在寻找这样的东西:

select tz.zone_id
     , tz.zone_name
     , max(tz.time_start)
from timezone tz 
where tz.time_start < strftime('%s', 'now')
group by tz.zone_id
       , tz.zone_name
order by tz.zone_id;

SQLFiddle

【讨论】:

你是我的英雄 :) 不,我真的很接近,只需要使用 max 函数。无论如何都非常感谢。你让我很开心:)

以上是关于SQL查询和过滤数据的主要内容,如果未能解决你的问题,请参考以下文章

查询SQL,写一个查询SQL用来过滤表中数据,类似select ... from?

sql语句查询过滤重复数据

过滤 SQL 查询

过滤 SQL 查询返回的结果

sql 查询语句 数据库 过滤重复记录

访问 SQL 子查询 WHERE 子句不过滤结果 [关闭]