我知道为什么会发生这种情况,但我想找到一个方法,如果可能的话。
例如,我有4行在我的数据库和每个有一个日期时间(这都是不同的)。我想做的是获得最近的2行,但使用升序,所以最老的是在结果集的顶部。
我当前正在使用
SELECT TOP 2 *
FROM mytable
WHERE someid = @something
ORDER BY added DESC
这让我得到正确的行,但在错误的顺序。如果我将DESC更改为ASC,它将获得正确的顺序,但是是四行中较老的两行。这一切对我来说都很有意义,但有没有别的办法呢?
编辑:用下面Elliot的答案解决了。但是,如果不为派生表设置别名,该语法将无法工作。以下是结果
SELECT * FROM
(SELECT TOP 2 * FROM mytable WHERE someid = @something ORDER BY added DESC) AS tbl
ORDER BY tbl.added ASC
我认为一个蛮力解决方案是:
SELECT *
FROM (SELECT TOP 2 * FROM mytable WHERE someid = @something ORDER BY added DESC)
ORDER BY added
这将允许"top 2 per something",并在OVER子句中添加一个PARTITION BY
SELECT *
FROM
(
SELECT *, ROW_NUMBER() OVER (ORDER BY added DESC) as rn
FROM mytable
WHERE someid = @something
) foo
WHERE rn <= 2
ORDER BY added
注意,派生表需要一个别名