【问题标题】:Order by clause is changing my result setOrder by 子句正在改变我的结果集
【发布时间】:2011-10-04 00:46:51
【问题描述】:

我知道为什么会这样,但如果可能的话,我想找到解决办法。

例如,我的数据库中有 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

【问题讨论】:

    标签: sql sql-server sql-order-by


    【解决方案1】:

    我认为一种蛮力解决方案是:

    SELECT *
    FROM (SELECT TOP 2 * FROM mytable WHERE someid = @something ORDER BY added DESC)
    ORDER BY added
    

    【讨论】:

    • 我在 ORDER BY 子句末尾收到语法错误 关键字“ORDER”附近的语法不正确。我是否需要 WHERE 子句才能使用 order by?
    • 没关系修复它。我在括号中的 select 语句的末尾添加了 'AS tbl',然后 ORDER BY tbl.added
    【解决方案2】:

    这将允许在 OVER 子句中添加 PARTITION BY 的“每件事前 2 个”

    SELECT *
    FROM
      (
      SELECT *, ROW_NUMBER() OVER (ORDER BY added DESC) as rn
      FROM mytable
      WHERE someid = @something
      ) foo
    WHERE rn <= 2
    ORDER BY added
    

    注意派生表需要别名

    【讨论】:

    • 与上面的 Elliot Nelson 相比,这种方法有什么优势?
    • @James Hay:老实说,除了可扩展“每组前 n 个”类型查询或更复杂的排序之外,没有。
    • 它运作良好,所以给你点赞。但我想为了简洁起见,我会选择上面的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-15
    相关资源
    最近更新 更多