假设我有一张类似于以下内容的表格:
Item Description Time
----- ----------- -----
ItemA1 descript 08-16-2013 00:00:00
ItemA2 descript 08-16-2013 00:00:00
ItemA3 descript 08-16-2013 00:00:00
.
.
ItemAN descript 08-16-2013 00:00:00
ItemB1 descript 08-13-2013 00:00:00
ItemB2 descript 08-13-2013 00:00:00
ItemB3 descript 08-13-2013 00:00:00
.
.
ItemBN descript 08-13-2013 00:00:00
.
.
.
ItemX1 descript 01-13-2012 00:00:00
ItemX2 descript 01-13-2012 00:00:00
ItemX3 descript 01-13-2012 00:00:00
.
.
ItemXN descript 01-13-2012 00:00:00
定期添加项目组。添加一组项目时,它们都添加了相同的“时间”字段。 “时间”基本上作为该项目组的唯一索引。
我想选择时间第二高的项目组。在此示例中,我的查询应该拉出“B”项。我知道我可以做max(time
)来选择“A”项,但我不知道我会怎么做到最后。
我的“时间”列存储为TIMESTAMP,如果这意味着什么。
答案 0 :(得分:15)
您可以尝试以下内容:
SELECT MAX(Time)
FROM yourTable
WHERE Time < (SELECT MAX(Time) FROM yourTable)
答案 1 :(得分:7)
一种方法:
SELECT t.*
FROM mytable t
JOIN ( SELECT l.time
FROM mytable l
GROUP BY l.time
ORDER BY l.time DESC
LIMIT 1,1
) m
ON m.time = t.time
这使用内联视图(指定别名为m)来返回第二个“最大”时间值。 GROUP BY为我们提供了一个独特的列表,ORDER BY DESC将最新的列表放在第一位,而“技巧”则是LIMIT,它返回第二行。 LIMIT(m,n)=(先跳过m行,然后返回n行)
使用该时间值,我们可以联接回原始表,以获得具有匹配时间值的所有行。
使用前导列为time
的索引会增强性能。 (我认为MySQL应该能够避免“使用filesort”操作,并且可以非常快速地从内联视图查询中获取结果。)
但是,在内联视图查询中包含谓词,如果您“知道”第二个最新时间永远不会超过一定天数,则不会影响性能:
WHERE l.time > NOW() + INTERVAL -30 DAYS
但添加了该内容后,如果time
超过30天,则查询将不会返回“第二个最新”组。
获取第二个最新版本的SELECT MAX(time) WHERE time < ( SELECT MAX(time)
方法(在其他答案中给出的方法)可能会更快,特别是如果没有带有time
的前导列的索引,但性能最好通过实际测试。具有前导时间列的索引也将加速MAX()方法。)
通过更改LIMIT
条款...... LIMIT(3,1)
,LIMIT(41,1)
等,我可以轻松扩展我提供的查询以获取第4个最新版本,第42个最新版本等。
答案 2 :(得分:5)
这应该给你第二大时间:
SELECT time FROM table GROUP BY time ORDER BY time DESC LIMIT 1,1
答案 3 :(得分:1)
SELECT T1.ITEM
FROM YOURTABLE T1
WHERE T1.TIME = ( SELECT MAX(T2.TIME)
FROM YOURTABLE T2
WHERE T2.TIME < ( SELECT MAX(T3.TIME)
FROM YOURTABLE T3
)
)
答案 4 :(得分:0)
像这样非常简单的东西应该有效
select * from my-table where time =
(Select top 1 time
from (select top 2 time from my-table order by time desc)
order by time asc)
答案 5 :(得分:0)
以下是我认为应该适用于您的问题的另一种解决方案:
CREATE TEMPORARY TABLE xHighest AS (SELECT DISTINCT Time FROM `my-table` ORDER BY Time DESC LIMIT 1,1);
SELECT * FROM `my-table` JOIN xHighest ON (my-table.Time = xHighest.Time);
您可以通过更改LIMIT的第一个参数来选择是否应使用第二,第三,......最高值。
答案 6 :(得分:0)
MYSQL:限制基础解决方案
示例:记录1,2,3,4,5。
LIMIT 2,1表示它将返回第3个最高数字,因为LIMIT 1,1返回第2个最高数字,依此类推
SELECT rc。rc_officer_id
FROM recovery_complain_officer rc ORDER BY rc。rc_officer_id
DESC LIMIT 2,1
答案 7 :(得分:0)
也许TOP和START AT可以在这里提供帮助。 我已经在Sybase SQL中使用了此功能。
从2开始*从Table_Name到ORDER BY CREATEDDATETIME DESC开始;