如何解决此问题 - 通过更改SQL Server中的项目顺序来分组

时间:2016-01-24 09:43:36

标签: sql sql-server

我正在使用SQL Server 2014,我从视图中获取数据。一旦我使用分组,项目的顺序就会改变,我怎样才能获得订单使用此分组后返回,有一个日期列,但它不保存任何时间,所以我不能根据日期对它进行排序.. 如何按照使用Group by之前显示的顺序显示数据?有人有任何想法请帮忙吗?

由于

3 个答案:

答案 0 :(得分:0)

您可以强制执行特定订单的唯一方法是明确使用ORDER BY子句。否则,不保证行的顺序(take a look at this article以获取更多详细信息),数据库引擎将根据“尽可能快”或“尽可能快地从磁盘检索”规则返回行。因此,在几秒钟的范围内,顺序也可以在同一查询的执行之间变化。

执行DISTINCTGROUP BYORDER 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子句。