我在StatusHistory表中有一个StatusID的表。一个客户可能是多个statusID。我需要找到之前的statusID,这意味着第二个状态ID就是他所持有的。
我现在正以这样的方式获得最新信息:
SELECT top 1 StatusIDHeld
FROM dbo.UserStatusHistory
WHERE userid=2154
ORDER BY tatusChangedOn DESC
问题:
我需要第二个statusID意味着之前的statusID
如何从表中找到第二个值(StatusID)。?
答案 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;