2

下の図のような統計テーブルのような効果を得るには、テーブルから 2 つの日付間のプロトコル違反と期間の発生をカウントする必要があります。

期待される効果:

ここに画像の説明を入力

説明:

ご覧のとおり、違反テーブルに存在する「国」、「サイト」、および同じテーブル「違反」のDBに存在するプロトコル違反期間の「数」、「最大」、「最小」、および「平均」を選択する必要があります2 つの日付の間。したがって、カウントする必要があります。

  • 国およびサイトごとの Violations テーブルに存在するプロトコル違反の発生数
  • 国およびサイトごとのプロトコル違反の最小/最大/平均期間

2 つの異なる条件の下で:

  • 発見日から報告日までの発生数
  • 報告日から確認日までの発生数

データベース構造:

SQLFILDDLE で入手可能:ここを見てください

添付の 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 dateに、期間のリストから最大/最小/平均値を選択する必要があります。reported date

私を手伝ってくれますか?

4

1 に答える 1

0

このクエリを確認してください。簡略化されており、アイデアと方向性を示すことができます。これ以上必要な場合は、お知らせください。コピーして貼り付けて結果を表示します。このクエリは、where 句の 2 つの日付の間の結果のみを選択して計算します。すべての日付などを表示する場所なしで、最初に内部クエリを実行する必要があります...このクエリは、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
 /
于 2013-03-14T12:50:51.917 に答える