1

次の質問を解決しようとしています:

2011 年 12 月 1 日から 2012 年 1 月 31 日までの週 (例: 1-52)、その週の開始日と終了日、およびその週に報告されたセンサーの温度の数を、週番号で並べ替えて表示します。降順。

次の選択で。

SELECT TO_CHAR(R.Report_Time,'WW') as Week, NEXT_DAY(R.Report_Time-7,'Monday'), NEXT_DAY(R.Report_Time-1, 'Sunday')
FROM REPORT R
WHERE R.Report_Time BETWEEN '01-DEC-2011' AND '31-JAN-2012'
GROUP BY Week
ORDER BY TO_CHAR(R.Report_Time, 'WW') DESC;

これにより、式によるグループ化ではないなど、クエリを正しく実行できないいくつかのエラーが発生しています。

テーブル REPORT は、データとレポート時間を含むレポートのリストです。

編集:

WE NEXT_DAY( NEXT_DAY( SENSOR_COUNT
-- --------- --------- ------------
03 16-JAN-12 22-JAN-12        1
02 09-JAN-12 15-JAN-12        1
02 09-JAN-12 15-JAN-12        1
02 09-JAN-12 15-JAN-12        1

プリントアウトしたものです。ここでわかるように、週だけでグループ化されているようには見えませんが、出力は次のように近いものになるはずです。

WE NEXT_DAY( NEXT_DAY( SENSOR_COUNT
-- --------- --------- ------------
03 16-JAN-12 22-JAN-12        1
02 09-JAN-12 15-JAN-12        3
4

2 に答える 2

1

エイリアスを GROUP BY することはできません。グループ化する式を完全に指定する必要があります。

また、さらに先に進む可能性のあるいくつかのことを追加しました。

SELECT TO_CHAR(R.Report_Time,'WW') as Week
     , NEXT_DAY(R.Report_Time-7,'Monday')
     , NEXT_DAY(R.Report_Time-1, 'Sunday')
     , COUNT(*) Sensor_count
FROM REPORT R
WHERE R.Report_Time BETWEEN '01-DEC-2011' AND '31-JAN-2012'
GROUP BY TO_CHAR(R.Report_Time,'WW'), NEXT_DAY(R.Report_Time-7,'Monday')
       , NEXT_DAY(R.Report_Time-1, 'Sunday')
ORDER BY TO_CHAR(R.Report_Time, 'WW') DESC;

クエリには他にも問題があることがわかりますが、すぐにわかります :-) おそらく、ここで分析関数を使用したいと思うでしょう。また、他の 2 つの列によるグループ化も終了します。

編集

あなたの編集に基づいて、これはあなたに近づくはずだと思います:

SELECT week, first_day, last_day, COUNT(*)
  FROM (SELECT TO_CHAR(R.Report_Time,'WW') as Week
             , NEXT_DAY(R.Report_Time-7,'Monday') first_day
             , NEXT_DAY(R.Report_Time-1, 'Sunday') last_day
         FROM REPORT R
        WHERE R.Report_Time BETWEEN '01-DEC-2011' AND '31-JAN-2012')
 GROUP BY week, first_day, last_day
 ORDER BY week DESC;
于 2013-02-23T20:19:47.753 に答える
0

さらに… ISO週を使った年間週表の例。必要に応じて IW を WW に変更します。開始日/終了日に日付を使用し、私の形式を使用して、曜日を「DY」としてハードコーディングせずに、week_start/end 日付を取得します。テーブル日付と BETWEEN 演算子を使用する場合、CONNECT BY を使用する必要はありません。私の例はテーブルに基づいていません。不要な列を削除し、カウントを追加し、ISO_wk# (または非 iso)、wk_starts、wk_ends でグループ化します...:

SELECT start_date
    , TRUNC(start_date, 'IW')                  wk_starts  
    , TRUNC(start_date, 'IW') + 7 - 1/86400    wk_ends
    , TO_NUMBER (TO_CHAR (start_date, 'IW'))   ISO_wk#
  FROM
  (
   SELECT TRUNC(SYSDATE, 'YEAR')+((LEVEL-1)*7)-1 AS start_date
    FROM dual
   CONNECT BY LEVEL <= 
   ( -- Nbr of days / 7 = 52 weeks in 2013 --
    SELECT Round((TRUNC(ADD_MONTHS (SYSDATE, 12), 'Y')-TRUNC(SYSDATE, 'Y'))/7) 
      FROM dual
   )
 )
/

START_DATE    WK_STARTS     WK_ENDS                ISO_WK#
-----------------------------------------------------------
12/31/2012    12/31/2012    1/6/2013 11:59:59 PM      1
1/7/2013      1/7/2013      1/13/2013 11:59:59 PM     2
1/14/2013     1/14/2013     1/20/2013 11:59:59 PM     3
...
...
12/23/2013    12/23/2013    12/29/2013 11:59:59 PM    52

週の日付と数字を確認するための週番号カレンダー: http://www.epochconverter.com/date-and-time/weeknumbers-by-year.php

于 2013-02-26T22:16:09.990 に答える