选择列中具有第二高值的行

时间:2013-08-16 18:46:20

标签: mysql sql database select

假设我有一张类似于以下内容的表格:

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,如果这意味着什么。

8 个答案:

答案 0 :(得分:15)

您可以尝试以下内容:

SELECT MAX(Time)
FROM yourTable
WHERE Time < (SELECT MAX(Time) FROM yourTable)

SQLFiddle Demo

答案 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开始;