Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
优化Oracle SQL查询,以在包含7000000条记录的单个表中的多个列上完成group by_Sql_Oracle_Group By_Query Optimization - Fatal编程技术网

优化Oracle SQL查询,以在包含7000000条记录的单个表中的多个列上完成group by

优化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

我是SQL新手,需要一些建议。执行以下操作的最有效(运行最快的查询)方法是什么-

选择表中的所有列-

-根据两列中包含的唯一值执行“分组依据”:“顶行id”和“外部参考”

-根据不同字段(如support_id)中包含的最大值或最小值(不管是哪一个),从每个组中选择一条记录

我的团队中有人提供了下面的查询,但我似乎无法让它工作。我在尝试执行时收到一条错误消息,说明“关系运算符无效”

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
    )