我正在使用SQL Server 2014,我从视图中获取数据。一旦我使用分组,项目的顺序就会改变,我怎样才能获得订单使用此分组后返回,有一个日期列,但它不保存任何时间,所以我不能根据日期对它进行排序.. 如何按照使用Group by之前显示的顺序显示数据?有人有任何想法请帮忙吗?
由于
答案 0 :(得分:0)
您可以强制执行特定订单的唯一方法是明确使用ORDER BY
子句。否则,不保证行的顺序(take a look at this article以获取更多详细信息),数据库引擎将根据“尽可能快”或“尽可能快地从磁盘检索”规则返回行。因此,在几秒钟的范围内,顺序也可以在同一查询的执行之间变化。
执行DISTINCT
,GROUP BY
或ORDER BY
时,SQL Server会根据用于该查询的索引自动执行SORT
数据。
查看查询的执行计划将显示正在使用哪些索引(以及该索引中的隐式列)对数据进行排序。
答案 1 :(得分:0)
也许你可以在没有任何OVER和ORDER BY关键字的情况下使用row_number()函数?这应该在子选择中完成,当您在外部SELECT中对数据进行分组时,请使用编号列上的AVG()函数并按此顺序对结果进行排序。问题是,当您对行进行分组时,原始行会消失。如果GROUP BY的目的那就是那种。 ;)根据你的GROUP BY,你所提出的问题可能在逻辑上是不可能的。
编辑: 找到这个解决方案谷歌搜索:http://blog.sqlauthority.com/2015/05/05/sql-server-generating-row-number-without-ordering-any-columns/
因此,您可以对这样的行进行编号,以便在GROUP BY:
之前保持表中行的顺序row_number() OVER (ORDER BY (SELECT 1))
答案 2 :(得分:0)
表和视图基本上是无序集。要按特定顺序获取行,您应始终在要订购的列上添加ORDER BY
子句。
我假设您之前从没有VIEW
子句的ORDER BY
中选择了。从SELECT
语句而不是 ORDER BY
语句返回行的顺序为未定义。您获得这些订单的顺序可能会因任何原因而改变(例如,某些原因列出here)。
您的问题源于您在没有SELECT
的情况下依赖来自VIEW
的{{1}}的订单时所犯的错误。您应该在ORDER BY
语句中开始使用ORDER BY
条款。
如何以与使用分组依据之前显示的顺序相同的顺序显示数据?
答案:如果您的初始陈述没有SELECT
条款,则不能。
解决方案:确定您希望结果集的顺序,并在初始查询和带有ORDER BY
子句的版本中为这些列添加ORDER BY
子句。