2013-05-06 75 views
2

所以基本上,我想通过给定列有多少次值来排序查询。我通过与另一个查询重复计数的查询完成了此操作,但我想避免其他大量查询。我想这可能会有一些窍门,通过那个做我想做的事情。通过没有连接的行重复来排序查询结果

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

使用

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

谢谢!

+0

我不完全理解这些例子,那么这个关闭吗? 'SELECT user1,rev1,rev2,COUNT(user2)FROM someTable WHERE something1 = something2 GROUP BY user1,rev1,rev2 ORDER BY COUNT(user2)'。如果这不正确,请发布样本'someTable'行和期望的输出 - 我确定有人可以提供帮助。 – 2013-05-06 18:37:28

+0

你是否也希望显示“COUNT”?如果是这样,你需要把它放到'SELECT'部分。另外,你在第二个'ORDER BY'中没有'DESC',所以你可能希望你的结果按这种方式排序。 – 2013-05-06 18:39:04

+0

因为出现错误,我不能在第二个上写下DESC。我得到'ORA-00937:不是一个单一群组功能'。我将在一分钟内尝试戈登的建议。 – 2013-05-06 18:43:42

回答

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

编辑:戈登从30secs殴打! )

+0

这看起来更优雅,正是我所需要的。 – 2013-05-06 18:50:32

+0

有没有什么办法可以让它成为前10名? – 2013-05-06 19:25:11

+0

尝试更新的查询 – Sebas 2013-05-06 19:41:08

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。这样,如果某些值具有相同的计数,则它们仍将被分开。

0

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

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

+0

我试图削减我的查询,我认为这可能会降低大约一半的时间。 – 2013-05-06 18:47:36