优化Oracle SQL查询,以在包含7000000条记录的单个表中的多个列上完成group by
我是SQL新手,需要一些建议。执行以下操作的最有效(运行最快的查询)方法是什么- 选择表中的所有列- -根据两列中包含的唯一值执行“分组依据”:“顶行id”和“外部参考” -根据不同字段(如support_id)中包含的最大值或最小值(不管是哪一个),从每个组中选择一条记录 我的团队中有人提供了下面的查询,但我似乎无法让它工作。我在尝试执行时收到一条错误消息,说明“关系运算符无效”优化Oracle SQL查询,以在包含7000000条记录的单个表中的多个列上完成group by,sql,oracle,group-by,query-optimization,Sql,Oracle,Group By,Query Optimization,我是SQL新手,需要一些建议。执行以下操作的最有效(运行最快的查询)方法是什么- 选择表中的所有列- -根据两列中包含的唯一值执行“分组依据”:“顶行id”和“外部参考” -根据不同字段(如support_id)中包含的最大值或最小值(不管是哪一个),从每个组中选择一条记录 我的团队中有人提供了下面的查询,但我似乎无法让它工作。我在尝试执行时收到一条错误消息,说明“关系运算符无效” Select * from STAGE.SFS_GH_R3_IB_ENTLMNT_CONTACTS Where
Select *
from STAGE.SFS_GH_R3_IB_ENTLMNT_CONTACTS
Where support_id, external_reference, top_line_id in (
select max(support_id),
external_reference,
top_line_id from STAGE.SFS_GH_R3_IB_ENTLMNT_CONTACTS
)
还有一件事——我们正在执行Group By的列在某些记录中包含空值。我们希望这些被排除在查询之外
非常感谢您提供的任何帮助。尽管您将其表述为分组查询,但还有另一种方法使用row_number()。这将根据“order by”子句枚举组中的每一行。在以下查询中,它根据外部参照和顶行id(按支持id排序)枚举每个组:
select *
from (Select t.*,
row_number() over (partition by external_reference, top_line_id
order by support_id) as seqnum
from STAGE.SFS_GH_R3_IB_ENTLMNT_CONTACTS t
)
where seqnum = 1
这应该有效(无法测试)
谢谢你,戈登。我没有考虑使用row_number和“orderby”子句。我将尝试一下并发布结果。嗨,Gordon,Oracle10g中有“row_number”和“seqnum”伪列。蟾蜍不承认“row_number”是一个保留字,但它确实承认ROWNUM。蟾蜍也不认识“seqnum”。我能用“sequence.CURRVAL”或“sequence.NEXTVAL”来代替“seqnum”吗?我发现了错误。您在上面提供的查询是100%正确的,除了我需要在t后面加一个逗号之外。*如果您使用row_number,那么数据库必须为每个窗口维护一个排序列表,计算出该列表中每一行的位置。如果您使用Min(),您应该有更多的内存和cpu效率高的查询。Min的问题是rhere可能会重复br。谢谢6opuc。我现在正在运行查询。一旦它运行完毕,我会告诉你执行时间。
SELECT
*
FROM
stage.sfs_gh_r3_ib_entlmnt_contacts
WHERE
(support_id, external_reference, top_line_id) IN
(
SELECT
max(support_id),
external_reference,
top_line_id
FROM
stage.sfs_gh_r3_ib_entlmnt_contacts
WHERE
external_reference IS NOT NULL AND
top_line_id IS NOT NULL
GROUP BY
top_line_id, external_reference
)