更新:下面的 Kordirko 的解决方案确实适用于 SQL Fiddle,但正如我在评论中提到的那样,该代码在我自己的 mysql 数据库中不起作用。我直接复制了模式命令并从小提琴运行查询的副本。我检查了两者,它们是相同的代码。我在我的数据库和小提琴之间验证了相同的 5.1.61 mysql 版本。在实时数据库中,为 id 2 返回 3 行,在小提琴上仅返回 2 行(预期效果)。fiddle 可以在通过之前更改查询吗?
背景:
我有一张数据表,作为扫描结果的历史记录保存。通常它用于绘制结果随时间变化的趋势,但我想尝试其他方法。如果至少有 2 个数据点,我想提供最新的上升或下降趋势(百分比)。更具体地说,我还想将其限制为最近 7 天,以将趋势范围限制在活动项目中。
请注意,该表仅在第一次运行项目时更新,并且如果 issues_count 与之前的运行相比也发生了变化。
样品表:
id issues_count updated
1 7922 2013-10-02 08:22:31
1 7981 2013-10-03 08:22:43
2 7754 2013-10-10 12:06:45
2 7922 2013-10-11 12:06:45
2 7981 2013-10-12 02:09:43
3 15536 2013-10-12 02:09:43
4 1233 2013-10-11 12:06:45
4 2493 2013-10-12 02:09:43
5 4349 2013-10-12 02:09:44
表结构:
CREATE TABLE IF NOT EXISTS `issue_history` (
`id` bigint(20) unsigned NOT NULL,
`issues_count` mediumint(8) unsigned NOT NULL,
`updated` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
KEY `id_index` (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=ascii;
结果逻辑:
在上面的示例中,我想忽略两个 '1' id 条目,因为它们都超过 7 天(从今天开始)。我不想为 id '3' 和 id '5' 返回任何东西,因为它们到目前为止只有一个数据点。对于 id '2' 和 '4' 我想根据时间戳返回最新的和直接在它之前的那个(不是之前的任何一个,最多 2 个)。
示例结果:
2 7922 2013-10-11 12:06:45
2 7981 2013-10-12 02:09:43
4 1233 2013-10-11 12:06:45
4 2493 2013-10-12 02:09:43
其他想法:
顺序并不那么重要,尽管我可能希望首先按 id(asc 或 desc)对它们进行分组,然后按 desc 中的时间戳进行分组。
如果我要进行低效的尝试,我可以通过在过去 24 小时内对所有 id 进行选择来处理这个问题,然后可能选择与这些 id 匹配的所有行,按时间戳 desc 排序,限制为 2。然后我的代码将必须删除每个 id 少于 2 行的结果。可能我会追求从第一个中选择子查询并嵌入到第二个中。我仍然认为这不是最好的方法,但应该起作用。
我担心这个表会以每天几千行的速度增长,我想尽量减少运行命令的时间。我特别不想从程序中两次访问数据库。