排序子句改变了我的结果集



我知道为什么会发生这种情况,但我想找到一个方法,如果可能的话。

例如,我有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

注意,派生表需要一个别名

最新更新