如何选择两个日期之间的统计表计数事件

时间:2013-03-13 16:24:36

标签: sql oracle oracle11g

我需要计算协议违规的发生次数和表中两个日期之间的持续时间,以达到类似统计表的效果,如下图所示:

预期效果:

enter image description here

说明:

正如您所看到的,我需要选择“国家/地区”,“网站”和“网站”。存在于违规表格中:' Numbers',' Maximum',' Minimum'和'意思是'在同一个表格中的数据库中存在的协议违规持续时间'违规行为' 两个日期之间。所以我们要计算:

  • 协议违规出现现存在违规行为表中的国家/地区和网站
  • min / max / avg 持续时间违反国家和网站的协议

在两种不同的条件下:

  • 发现日期到报告日期
  • 发生
  • 报告日期确认
  • 发生

数据库结构:

在SQLFILDDLE上可用:Look HERE

我将添加附加SQLFIDDLE中的代码有更多的表和查询但是现在对于这个问题它们是不必要的。随意使用它。 我没有删除旧查询,因为有很好的方法:

  • ' - 全部 - '和
  • ' - 未知 - '值。 -

违规表:

create table violations (
  id long,
  country varchar(20),
  site varchar(20),
  status_id int,
  trial_id int,
  discovered_date date,
  reporded_date date,
  confirmed_date date
);

网站表:

create table site (
  id long,
  site varchar(20)
);

我的第一次尝试:

以下是我的新SQLFIDDLE,其中包含了改进评论行所需的查询:

SELECT v.country as country, v.site as site,
  COUNT(*) as N --,
  --MAX(list of durations in days between discovered date to repored date on each violation by country and site) as "Maximum",
  --MIN(list of durations in days between discovered date to repored date on each violation by country and site) as "Minimum",
  --AVG(list of durations in days between discovered date to repored date on each violation by country and site) as "Mean"
FROM violations v
WHERE v.trial_id = 3
GROUP BY ROLLUP (v.country, v.site)

我设法用我的想法创建抽象查询。但我有一个问题是为MAX,MIN和AVG编写正确的查询,我们必须从国家和网站的每次违规行为中discovered datereported date之间的持续时间列表中选择最大/最小/平均值

你能帮我吗?

1 个答案:

答案 0 :(得分:0)

请检查此查询。它是简化的,可以给你一个想法和方向。如果您需要更多,那么请告诉我。复制并粘贴以查看结果。此查询将仅选择并计算where子句中两个日期之间的结果。您需要首先运行内部查询w / out在哪里查看所有日期等...此查询计算2个日期之间的违规。不确定天数的持续时间列表...请参阅下面的持续时间计数。您可以添加MAX / MIN等...

-- Days between (duration) = (end_date-start_date) = number of days (number) --
SELECT (to_date('14-MAR-2013') - to_date('01-MAR-2013')) days_between
  FROM dual
/


SELECT country, site
 , Count(*) total_viol
 , MAX(susp_viol) max_susp_viol
 , MIN(susp_viol) min_susp_viol
FROM
(
 SELECT 'GERMANY' country, '12222' site, 1 susp_viol, 2 conf_viol, trunc(Sysdate-30) disc_date, trunc(Sysdate-25) conf_date
   FROM dual
  UNION
 SELECT 'GERMANY',  '12222'            , 3          , 14, trunc(Sysdate-20) , trunc(Sysdate-15)  FROM dual
  UNION
 SELECT 'GERMANY',  '12222'            , 6          , 25, trunc(Sysdate-20) , trunc(Sysdate-15)  FROM dual
  UNION
 SELECT 'GERMANY',  '12222'            , 2          , 1, trunc(Sysdate-20) , trunc(Sysdate-15)  FROM dual
  UNION
 SELECT 'GERMANY',  '13333'            , 10         , 5,  trunc(Sysdate-15) , trunc(Sysdate-10)  FROM dual
  UNION
 SELECT 'GERMANY',  '13333'            , 15         , 3,  trunc(Sysdate-15) , trunc(Sysdate-10)  FROM dual
  UNION
 SELECT 'GERMANY',  'Unknown Site'     , 0          , 7,  trunc(Sysdate-5) ,  trunc(Sysdate-2)  FROM dual
  UNION
 SELECT 'RUSSIA',  '12345'             , 1          , 5,  trunc(Sysdate-20) ,  trunc(Sysdate-15)  FROM dual
  UNION
 SELECT 'RUSSIA',  '12345'             , 2          , 10,  trunc(Sysdate-15) ,  trunc(Sysdate-12)  FROM dual
 UNION
SELECT 'RUSSIA',  'Unknown Site'      , 10          , 10,  trunc(Sysdate-3) ,  trunc(Sysdate-1)  FROM dual
 ) 
  -- replace sysdate with your_date-default format is to_date('14-MAR-2013') or give format mask
 WHERE conf_date BETWEEN trunc(Sysdate-20) AND trunc(Sysdate-10)
 GROUP BY ROLLUP (country, site)
 ORDER BY country, site
/

持续时间计数:

SELECT country, site, (conf_date-disc_date) duration, count(*) total_durations 
  FROM
 (
 SELECT 'GERMANY' country, '12222' site, 1 susp_viol, 2 conf_viol, trunc(Sysdate-30) disc_date, trunc(Sysdate-20) conf_date
   FROM dual
  UNION
 SELECT 'GERMANY',  '12222'            , 3          , 14, trunc(Sysdate-20) , trunc(Sysdate-12)  FROM dual
  UNION
 SELECT 'GERMANY',  '12222'            , 6          , 25, trunc(Sysdate-20) , trunc(Sysdate-12)  FROM dual
  UNION
 SELECT 'GERMANY',  '12222'            , 2          , 1, trunc(Sysdate-20) , trunc(Sysdate-12)  FROM dual
  UNION
 SELECT 'GERMANY',  '13333'            , 10         , 5,  trunc(Sysdate-12) , trunc(Sysdate-6)  FROM dual
  UNION
 SELECT 'GERMANY',  '13333'            , 15         , 3,  trunc(Sysdate-17) , trunc(Sysdate-11)  FROM dual
  UNION
 SELECT 'GERMANY',  'Unknown Site'     , 0          , 7,  trunc(Sysdate-5) ,  trunc(Sysdate-2)  FROM dual
  UNION
 SELECT 'RUSSIA',  '12345'             , 1          , 5,  trunc(Sysdate-20) ,  trunc(Sysdate-15)  FROM dual
  UNION
 SELECT 'RUSSIA',  '12345'             , 2          , 10,  trunc(Sysdate-15) ,  trunc(Sysdate-12)  FROM dual
  UNION
 SELECT 'RUSSIA',  'Unknown Site'      , 10          , 10,  trunc(Sysdate-3) ,  trunc(Sysdate-1)  FROM dual
 ) 
 WHERE conf_date BETWEEN trunc(Sysdate-20) AND trunc(Sysdate-10) 
  GROUP BY ROLLUP (country, site, (conf_date-disc_date))
  ORDER BY country, site
 /