Sql 按行重复顺序排列查询结果,无连接
因此,基本上,我想按给定列具有值的次数对查询进行排序。我通过与另一个计算重复次数的查询进行连接来实现这一点,但我希望避免使用另一个扩展查询。我在想也许会有一些关于秩序的把戏,这就是我想要的 注意:我正在处理的查询非常庞大,并且充满了公司信息,因此我将编写一个示例查询来说明我的问题 使用Sql 按行重复顺序排列查询结果,无连接,sql,database,oracle,Sql,Database,Oracle,因此,基本上,我想按给定列具有值的次数对查询进行排序。我通过与另一个计算重复次数的查询进行连接来实现这一点,但我希望避免使用另一个扩展查询。我在想也许会有一些关于秩序的把戏,这就是我想要的 注意:我正在处理的查询非常庞大,并且充满了公司信息,因此我将编写一个示例查询来说明我的问题 使用 SELECT user1, rev1, user2, rev2, userCount FROM someTable, (SELECT user2, count(*) userCount FROM
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技巧可以帮我解决这个问题吗
谢谢 您的查询不起作用,因为您使用的是
count()
,而没有相应的分组依据。这毫无意义,因为您没有聚合查询
执行您想要执行的操作的一个好方法是使用分析函数:
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
添加到了orderby
。这样,如果某些值具有相同的计数,它们仍将被分隔
SELECT user1, rev1, user2, rev2, COUNT(*) OVER (PARTITION BY user2) as c
FROM someTable
WHERE something1 = something2
ORDER BY c DESC
编辑:从30秒开始被戈登打败!!) 如果可以获得更快的性能,那么使用扩展查询并不一定是坏事。话虽如此,很难说您不想使用第一个查询的原因是什么。您是否遇到性能问题?如果是这样,那么表使用的索引将有所帮助
无论如何,第一个查询中的嵌套查询似乎缺少“GROUPBY”子句。“something1=something2”在性能或结果方面可能意味着不同的事情。因此,如果你能举一个更具体的例子,那会很有帮助。我不完全理解这些例子,那么这就接近了吗<代码>从something1=something2按用户分组的something2表格中选择user1、rev1、rev2、COUNT(user2)
。如果这不正确,请发布示例someTable
行和预期输出-我相信有人可以提供帮助。是否还希望显示计数
?如果是这样,您需要将其放入SELECT
部分。另外,您的第二个ORDER BY
中没有DESC
,因此您可能希望您的结果以这种方式排序。由于出现错误,我无法在第二个上写入DESC。我得到了ORA-00937:没有一个组函数
。我马上就要试试戈登的建议。我想把我的问题精简一下,我想这可能会减少一半的时间。这看起来更优雅,这正是我所需要的。有没有办法让它只给我前10个不同的?这对我不起作用,因为我可能会得到超过1行匹配C值的数据(这就是我想要的)。我想得到前10个user2,然后返回所有与user2相同的结果,你需要一个子查询,这样可以吗?它会保持计数(user2)的速度(按user2划分)为c?