【发布时间】:2021-12-21 09:15:48
【问题描述】:
如果有以下查询(我的查询的简化示例,为了便于阅读):
SELECT make, year, color, count(*)
FROM cars
GROUPY BY make, year, color
ORDER BY 4 DESC;
我想遍历结果表并为每行的条件生成子查询(下面的示例)。然后,我希望使用这些子查询来制作一个包含样本结果(可能是 3 行)的表,该表符合原始查询结果中每一行的标准(例如,因为 2019 年有多个黑色吉普车)。
SELECT * from cars
WHERE make = 'Jeep'
AND year = '2019'
AND color = 'Black';
SELECT * from cars
WHERE make = 'Ford'
AND year = '2018'
AND color = 'Red';
这似乎是一个奇怪或不必要的请求。但是,鉴于我的实际问题的复杂性,我相信这是最好的方法。这是我想要采用的方法,因为我想要一个简化的解决方案,我可以返回并更改以供将来使用和查询的不同变体。
我目前使用 ROW_NUMBER() 作为我的方法(如下),每组最多检索三行。虽然这可以为我编译,但它从未运行完成,因为它的运行时间很长。当我手动完成该过程时(我希望使用此查询自动化),生成所需输出的运行时不会花费太长时间(一两个小时)。但是,当我运行此解决方案时,它会持续运行一整天,然后由于数据库连接超时,Oracle 会停止该进程。有没有人有更好的方法来解决这个问题,或者让这个问题更有效地运行?
select *
from (
select c.*,
row_number() over(partition by make, year, color order by id) as rn
from cars c
) x
where rn <= 3
注意:我使用的是 Oracle SQL Developer
【问题讨论】:
-
您只需要选择语句吗?或者您将在 proc 或函数中使用这些查询?
-
我愿意接受任何方法,谢谢。
-
我现在回复了,因为我没有地方可以测试,你可以检查它是否适合你
-
感谢您的想法,我希望将每组的样本行数限制为 3,我在您的方法中看不到这一点。此外,您的方法将从整个汽车表中提取,而不是从我的原始查询(此页面上的第一个查询)中提取查询结果
-
它可以很容易地添加。我刚刚编辑了我的答案。你可以检查