2

私は一見簡単なクエリで立ち往生していますが、最後の数時間はそれを機能させることができませんでした.

filesファイル名と、このファイル内のレコード、作成日 ( create_date)、処理日( ) などの値を保持するテーブルがありますprocessing_date。作成日が異なる時間帯に複数のファイルが存在する可能性があり、作成日と同じ日に処理されない可能性があります。実際には、処理されるまでに最大 3 日またはそれ以上かかる場合もあります。

例として、これらの行があるとします。

create_date            | processing_date
------------------------------
2012-09-10 11:10:55.0  | 2012-09-11 18:00:18.0
2012-09-10 15:20:18.0  | 2012-09-11 13:38:19.0
2012-09-10 19:30:48.0  | 2012-09-12 10:59:00.0
2012-09-11 08:19:11.0  | 2012-09-11 18:14:44.0
2012-09-11 22:31:42.0  | 2012-09-21 03:51:09.0

1 つのクエリで必要なのは、日ごとに切り捨てられたグループ化された列を取得し、とcreate_dateの差を表す 11 列を追加して、結果が大まかに次のようになるようにすることです。processing_datecreate_date

create_date   |   diff0days   | diff1days | diff2days | ... | diff10days
------------------------------------------------------------------------
2012-09-10    |       0             2           1       ...        0
2012-09-11    |       1             0           0       ...        1

など、要点を理解していただければ幸いです:)

create_date私はこれを試してみましたが、これまでのところ、たとえば 3 の差がある単一の集計列を取得できます。

SELECT TRUNC(f.create_date, 'DD') as created, count(1) FROM files f WHERE TRUNC(f.process_date, 'DD') - trunc(f.create_date, 'DD') = 3 GROUP BY TRUNC(f.create_date, 'DD')

単一のクエリを組み合わせてみたり、サブクエリを試したりしましたが、役に立たなかったか、少なくとも SQL に関する知識が十分ではありませんでした。

上記のように、さまざまな違いを列として含めることができるように、ヒントが必要です。どうすればこれを達成できますか?

4

3 に答える 3

2

それは基本的にピボットの問題です:

SELECT  TRUNC(f.create_date, 'DD') as created
,       sum(case TRUNC(f.process_date, 'DD') - trunc(f.create_date, 'DD')
                  when 0 then 1 end) as diff0days   
,       sum(case TRUNC(f.process_date, 'DD') - trunc(f.create_date, 'DD')
                  when 1 then 1 end) as diff1days   
,       sum(case TRUNC(f.process_date, 'DD') - trunc(f.create_date, 'DD')
                  when 2 then 1 end) as diff2days   
,       ...
FROM    files f 
GROUP BY 
        TRUNC(f.create_date, 'DD')
于 2012-10-10T19:42:50.287 に答える
1

Oracle 11g を使用しているため、 を使用して目的の結果を得ることができますpivot query

次に例を示します。

  -- sample of data from your question
  SQL> create table Your_table(create_date, processing_date) as
  2  (
  3        select '2012-09-10', '2012-09-11' from dual union all
  4        select '2012-09-10', '2012-09-11' from dual union all
  5        select '2012-09-10', '2012-09-12' from dual union all
  6        select '2012-09-11', '2012-09-11' from dual union all
  7        select '2012-09-11', '2012-09-21' from dual
  8   )
  9  ;

Table created



 SQL> with t2 as(
  2    select create_date
  3         , processing_date
  4         , to_date(processing_date, 'YYYY-MM-DD')  
                      - To_Date(create_date, 'YYYY-MM-DD') dif
  5      from your_table
  6    )
  7      select create_date
  8           , max(diff0) diff0
  9           , max(diff1) diff1
 10           , max(diff2) diff2
 11           , max(diff3) diff3
 12           , max(diff4) diff4
 13           , max(diff5) diff5
 14           , max(diff6) diff6
 15           , max(diff7) diff7
 16           , max(diff8) diff8
 17           , max(diff9) diff9
 18           , max(diff10) diff10
 19        from (select *
 20                from t2
 21                pivot(
 22                       count(dif)
 23                       for dif in ( 0 diff0
 24                                  , 1 diff1
 25                                  , 2 diff2
 26                                  , 3 diff3
 27                                  , 4 diff4
 28                                  , 5 diff5
 29                                  , 6 diff6
 30                                  , 7 diff7
 31                                  , 8 diff8
 32                                  , 9 diff9
 33                                  , 10 diff10
 34                                  )
 35                     ) pd
 36             ) res
 37      group by create_date
 38  ;

結果:

Create_Date Diff0 Diff1 Diff2 Diff3 Diff4 Diff5 Diff6 Diff7 Diff8 Diff9 Diff10
-------------------------------------------------------------------------------- 
2012-09-10    0     2     1     0     0     0     0    0      0     0     0 
2012-09-11    1     0     0     0     0     0     0    0      0     0     1 
于 2012-10-10T20:46:56.310 に答える
1
SELECT CreateDate,
    sum(CASE WHEN DateDiff(day, CreateDate, ProcessDate) = 1 THEN 1 ELSE 0 END) AS Diff1,
    sum(CASE WHEN DateDiff(day, CreateDate, ProcessDate) = 2 THEN 1 ELSE 0 END) AS Diff2,
    ...
FROM table
GROUP BY CreateDate
ORDER BY CreateDate
于 2012-10-10T19:44:54.010 に答える