Oracle查询优化帮助(包括TRUNC)

Oracle查询优化帮助(包括TRUNC),oracle,date,query-optimization,Oracle,Date,Query Optimization,这是问题所在。 closed\u ts是一个时间戳列。我想做的是,找出今天、本月、今年和本周有多少人“关门”。有更好的方法吗 select table_id, case when trunc(closed_ts) = trunc(SYSDATE, 'DD') then 1 else 0 end as day_count, case when trunc(closed_ts) >= trunc(SYSDATE, 'MM') then 1 else

这是问题所在。 closed\u ts是一个时间戳列。我想做的是,找出今天、本月、今年和本周有多少人“关门”。有更好的方法吗

select table_id,
  case
    when trunc(closed_ts) = trunc(SYSDATE, 'DD') then 1
    else 0
  end as day_count,
  case
    when trunc(closed_ts) >= trunc(SYSDATE, 'MM') then 1
    else 0
  end as month_count,
 case
   when trunc(closed_ts) >= trunc(sysdate, 'YYYY') then 1
   else 0
 end as year_count,
 case
   when trunc(closed_ts) >= TRUNC(sysdate, 'IW') then 1
   else 0
 end as week_count
from myTable

似乎您希望在每个case语句和groupby table_id周围使用sum()来聚合值,但是由于您询问了查询优化

如果有一个关闭的索引,你将无法使用它,因为你正在尝试它。截断结束日期是不必要的,因为您正在检查它是否严格大于日、周、月、年,因此此查询肯定会导致完整表扫描

我很可能会在没有trunc的情况下重写它,无论是否有索引:

select table_id
      ,sum(case when closed_ts >= trunc(sysdate) then 1 else 0 end) as day_count
      ,sum(case when closed_ts >= trunc(sysdate,'MM') then 1 else 0 end) as month_count
      ,sum(case when closed_ts >= trunc(sysdate,'YYYY') then 1 else 0 end) as year_count
      ,sum(case when closed_ts >= trunc(sysdate,'IW') then 1 else 0 end) as week_count
 from myTable
group by table_id
顺便说一句:table\u id听起来像一个主键或代理键-您确定要在结果中使用它吗?

在(closed\u ts,table\u id)上弹出一个索引,并在closed\u ts上应用一个谓词,如下所示

 select
   table_id,
   sum(case when closed_ts >= trunc(SYSDATE,'DD'  ) then 1 end) day_count,
   sum(case when closed_ts >= trunc(SYSDATE,'MM'  ) then 1 end) month_count,
   sum(case when closed_ts >= trunc(SYSDATE,'YYYY') then 1 end) year_count,
   sum(case when closed_ts >= trunc(SYSDATE,'IW'  ) then 1 end) week_count,
 from
   myTable
 where
   closed_ts >= least(trunc(SYSDATE,'YYYY'),trunc(SYSDATE,'IW'))
 group by
   table_id

正如user1842757所提到的,在关闭的语句中丢失trunc。您也可以在case语句中丢失ELSE 0

没有where子句,在关闭的语句上是否有索引与am求和和和和分组无关。为了简洁起见,我没有把它包括在最初的查询中。我们有关于关闭的索引。我将尝试>=而不使用trunc(关闭的)。谢谢你的快速回复。