通过行重复排序查询结果而不加入

时间:2013-05-06 18:29:00

标签: sql database oracle

所以基本上,我想根据给定列的值有多少次来查询我的查询。我通过与另一个计算重复的查询进行连接来完成此操作,但我想避免使用其他大量查询。我认为可能有一些技巧,顺序就是我想要的。

注意:我正在使用的查询非常庞大且充满了公司信息,因此我将编写一个示例查询来说明我的问题。

使用

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技巧可以解决这个问题?

谢谢!

3 个答案:

答案 0 :(得分: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值的行数并将其附加到行。

顺便说一下,我还在user2添加了order by。这样,如果某些值具有相同的计数,它们仍将被分开。

答案 1 :(得分:3)

SELECT user1, rev1, user2, rev2, COUNT(*) OVER (PARTITION BY user2) as c
FROM someTable
WHERE something1 = something2
ORDER BY c DESC

编辑:戈登在30秒内击败!! 。)

答案 2 :(得分:0)

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

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