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;

您的查询还有其他问题,您很快就会发现 :-) 您可能会想在这里使用分析函数。您还将按其他两列进行分组。

编辑

根据您的编辑,我认为这应该让您更接近:

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。使用您的日期作为开始/结束日期和我的格式来获取 week_start/结束日期,而无需将日期硬编码为“DY”。如果使用表日期和 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 回答