2

所以基本上,我想按给定列有多少次值来排序我的查询。我通过与另一个计算重复次数的查询进行连接来做到这一点,但我想避免其他广泛的查询。我认为 order by 可能有一些技巧可以满足我的要求。

注意:我正在使用的查询很大并且充满了公司信息,所以我将编写一个示例查询来说明我的问题。

使用

SELECT user1, rev1, user2, rev2, userCount
FROM someTable,
    (SELECT user2, count(*) userCount
     FROM someTable
     WHERE something1 = something2) counts
WHERE something1 = something2
AND counts.user2 = someTable.user2
ORDER BY userCount DESC

我得到了正确的结果,所以我尝试了

SELECT user1, rev1, user2, rev2 
FROM someTable
WHERE something1 = something2
ORDER BY COUNT(user2) DESC

但这不会产生我想要的结果。

是否有一些 SQL 技巧可以为我解决这个问题?

谢谢!

4

3 回答 3

3

您的查询不起作用,因为您使用的是count()没有相应的group by. 它只是没有意义,因为您没有聚合查询。

做你想做的事的一个好方法是使用分析函数:

SELECT user1, rev1, user2, rev2 
FROM (select t.*,
             COUNT(*) over (partition by user2) as numuser2
      from someTable
      WHERE something1 = something2
     ) t
ORDER BY numuser2 desc, user2

语法将count(*) over计算每个user2值的行数并将其附加到行。

顺便说一句,我也添加user2order by. 这样,如果某些值具有相同的计数,它们仍然会被分开。

于 2013-05-06T18:37:38.353 回答
3
SELECT user1, rev1, user2, rev2, COUNT(*) OVER (PARTITION BY user2) as c
FROM someTable
WHERE something1 = something2
ORDER BY c DESC

编辑:从 30 秒被戈登击败!!.)

于 2013-05-06T18:38:14.230 回答
0

如果您可以获得更快的性能,那么使用广泛的查询不一定是坏事。话虽如此,很难说出您不想使用第一个查询的原因是什么。您是否遇到性能问题?如果是这样,这将有助于您的表使用什么索引。

无论如何,您的第一个查询中的嵌套查询似乎缺少“GROUP BY”子句。“something1 = something2”在性能或结果方面可能意味着不同的东西。因此,如果您能举出更具体的例子,那将会很有帮助。

于 2013-05-06T18:38:48.170 回答