如何从表中查找第二个值。

时间:2015-02-16 08:20:24

标签: sql sql-server

我在StatusHistory表中有一个StatusID的表。一个客户可能是多个statusID。我需要找到之前的statusID,这意味着第二个状态ID就是他所持有的。

我现在正以这样的方式获得最新信息:

SELECT top 1 StatusIDHeld
FROM dbo.UserStatusHistory
WHERE userid=2154
ORDER BY tatusChangedOn DESC

问题:

我需要第二个statusID意味着之前的statusID

如何从表中找到第二个值(StatusID)。?

4 个答案:

答案 0 :(得分:4)

select StatusIDHeld 
from
(select 
    StatusIDHeld,
    ROW_NUMBER () over (order by tatusChangedOn DESC) as num
from dbo.UserStatusHistory
where userid=2154
) T
where T.num = 2

答案 1 :(得分:1)

执行此操作的一种方法是获取前两个,然后获取第二个:

select top 1 StatusIDHeld from (
  select top 2 StatusIDHeld, StatusChangedOn 
  from dbo.UserStatusHistory 
  order by StatusChangedOn DESC
) TMP order by StatusChangedOn ASC

答案 2 :(得分:1)

没有什么比表的第二个值更重要了。这取决于许多因素,如索引等。

为了能够获得1.,2.或第n条记录,具体取决于排序顺序,请使用ROW_NUMBER()函数。

SELECT StatusIDHeld 
FROM
(
    SELECT StatusIDHeld, ROW_NUMBER () OVER(ORDER by StatusIDHeld) as RowNo
    FROM UserStatusHistory
) AS t
where t.RowNo = 2

另一种方法是两次使用TOP指令:

SELECT TOP(1) StatusIDHeld
FROM (
    SELECT TOP(2) StatusIDHeld
    FROM UserStatusHistory
    WHERE userid=2154
    ORDER BY tatusChangedOn ASC
) AS t
ORDER BY StatusIDHeld DESC

答案 3 :(得分:0)

您需要将查询重置偏移1。

请试试这个:

select StatusIDHeld from dbo.UserStatusHistory order by tatusChangedOn DESC Limit 1 OFFSET 1;