1. 程式人生 > >按時間分組統計的SQL語句

按時間分組統計的SQL語句

如下表table1:

  日期(exportDate)               數量(amount)
   --------------                    -----------
  14-2月 -08                       20
  10-3月 -08                       2
     14-4月 -08                       6
  14-6月 -08                       75
  24-10月-09                      23
  14-11月 -09                      45
  04-8月 -10                       5
  04-9月 -10                       44
  04-10月-10                      88

  注意:為了顯示更直觀,如下查詢已皆按相應分組排序

  1.按年份分組

  select to_char(exportDate,‘yyyy’),sum(amount) from table1 group by to_char(exportDate,‘yyyy’);

  年份      數量
  -----------------------------
  2009    68
  2010    137
  2008    103

  2.按月份分組

  select to_char(exportDate,‘yyyy-mm’),sum(amount) from table1 group by to_char(exportDate,‘yyyy-mm’)

  order by to_char(exportDate,‘yyyy-mm’);

  月份           數量
  -----------------------------
  2008-02    20
     2008-03    2
  2008-04    6
  2008-06    75
  2009-10    23
     2009-11    45
  2010-08    5
  2010-09    44
  2010-10    88

  3.按季度分組

  select to_char(exportDate,‘yyyy-Q’),sum(amount) from table1 group by to_char(exportDate,‘yyyy-Q’)

  order by to_char(exportDate,‘yyyy-Q’);

  季度          數量
  ------------------------------
  2008-1    22
     2008-2    81
  2009-4    68
  2010-3    49
  2010-4    88

  4.按周分組

  select to_char(exportDate,‘yyyy-IW’),sum(amount) from table1 group by to_char(exportDate,‘yyyy-IW’)

  order by to_char(exportDate,‘yyyy-IW’);

  周             數量
  ------------------------------
  2008-07    20
  2008-11    2
  2008-16    6
  2008-24    75
  2009-43    23
  2009-46    45
  2010-31    5
  2010-35    44
     2010-40    88

  補充:

  按季度分組還有個比較笨的方法(參考網路資源)

  select to_char(exportDate,‘yyyy’),

  sum(decode(to_char(exportDate,‘mm’),‘01’,amount,‘02’,amount,‘03’,amount,0)) as 第一季,

  sum(decode(to_char(exportDate,‘mm’),‘04’,amount,‘05’,amount,‘06’,amount,0)) as 第二季,

  sum(decode(to_char(exportDate,‘mm’),‘07’,amount,‘08’,amount,‘09’,amount,0)) as 第三季,

  sum(decode(to_char(exportDate,‘mm’),‘10’,amount,‘11’,amount,‘12’,amount,0)) as 第四季

  from table1

  group by to_char(exportDate,‘yyyy’);

  年份        第一季     第二季     第三季     第四季
   --------------------------------------------------
  2009         0            0            0          68
  2010         0            0            49        88
  2008         22          81           0          0

5:按時間段統計

按時間段分組顯示 。。。
比如有資料是           

                        2010-8-13 09:46:05
                        2010-8-13 10:09:05
                        2010-8-13 10:46:05
按照每30分鐘分段統計,然後統計欄位顯示成10:00-10:30形式

SQL:

select to_char((trunc(sysdate)+trunc((motime-trunc(sysdate))*24*60/30)*30/60/24),'hh24:mi')||'-'||to_char((trunc(sysdate)+trunc((motime-trunc(sysdate))*24*60/30+1)*30/60/24),'hh24:mi') period, count(*) "total" from mo where trunc(motime)=to_date(&day,'yyyymmdd') group by to_char((trunc(sysdate)+trunc((motime-trunc(sysdate))*24*60/30)*30/60/24),'hh24:mi')||'-'||to_char((trunc(sysdate)+trunc((motime-trunc(sysdate))*24*60/30+1)*30/60/24),'hh24:mi') order by 1;

還可以使用connect by 和level來完成這個操作

這裡需要用connect by和level來共同構建當天內每分鐘的時間點。


select to_char(to_date(to_char(sysdate, 'yyyy-MM-dd') || ' 00:00:00','yyyy-MM-dd HH24:mi:ss') + (level / 24 / 60),'yyyy-MM-dd HH24:mi:ss') dt
  from dual
connect by level <=
           trunc((sysdate -to_date('2013-1-5 00:00:00', 'yyyy-MM-dd HH24:mi:ss')) * 24 * 60,0)
           
得到這樣的結果後,接下來的統計就簡單了很多,下面是統計每個時間點單據總數的sql:


select dt,
       (select count(1)
          from orderTest o
         where o.create_time >
               to_date(to_char(sysdate, 'yyyy-MM-dd') || ' 00:00:00',
                       'yyyy-MM-dd HH24:mi:ss')
           and o.create_time <= to_date(d.dt, 'yyyy-MM-dd HH24:mi:ss')) n
  from (select to_char(to_date(to_char(sysdate, 'yyyy-MM-dd') || ' 00:00:00',
                               'yyyy-MM-dd HH24:mi:ss') +
                       (level / 24 / 60),
                       'yyyy-MM-dd HH24:mi:ss') dt
          from dual
        connect by level <= trunc((sysdate -
                                  to_date('2013-1-5 00:00:00',
                                           'yyyy-MM-dd HH24:mi:ss')) * 24 * 60,
                                  0)) d
統計的結果如下:


DT                           N
------------------- ----------
2013-01-05 00:01:00          0
2013-01-05 00:02:00          0
2013-01-05 00:03:00          0
2013-01-05 00:04:00          0
2013-01-05 00:05:00          0
2013-01-05 00:06:00          0
2013-01-05 00:07:00          0
2013-01-05 00:08:00          0
2013-01-05 00:09:00          0
2013-01-05 00:10:00          0
2013-01-05 00:11:00          0
2013-01-05 00:12:00          0
2013-01-05 00:13:00          0
2013-01-05 00:14:00          0
2013-01-05 00:15:00          0
2013-01-05 00:16:00          0
2013-01-05 00:17:00          0
2013-01-05 00:18:00          0
2013-01-05 00:19:00          0
2013-01-05 00:20:00          0
由於是凌晨的關係,所以統計出來的資料都是0。


上面寫的語句都是預設時間間隔是1分鐘的,如果你需要修改間隔時間,只需要修改下面兩處地方


select to_char(to_date(to_char(sysdate, 'yyyy-MM-dd') || ' 00:00:00',
                               'yyyy-MM-dd HH24:mi:ss') +
                       (level / 24 / 60 /*自定義時間間隔*/),
                       'yyyy-MM-dd HH24:mi:ss') dt
          from dual
        connect by level <= trunc((sysdate -
                                  to_date('2013-1-5 00:00:00',
                                           'yyyy-MM-dd HH24:mi:ss')) * 24 * 60/*自定義時間間隔*/,
                                  0)
第一處地方需要除以間隔時間,第二處地方則是乘以間隔時間。


說到原理其實很簡單,先用系統當前時間減去今日的初始時間,減出來的天數*24*60就是分鐘數trunc之後就可以用做level了。

相關推薦

時間分組統計SQL語句

如下表table1:   日期(exportDate)               數量(amount)    --------------                    -----------   14-2月 -08                       2

Mysql資料庫裡面的String型別按照數字來排序以及時間排序的sql語句

mysql時間格式化,按時間段查詢MYSQL語句   2011-04-15 09:01:08|  分類: MySQL |舉報 |字號 訂閱  描述:有一個會員表,有個birthday欄位,值為'YYYY-MM-DD'格式,現在要查詢一個時間段內過生日的會員,比如'06-03'到'07-08'這個時間段內所有過

java加mysql時間條件查詢sql語句

java程式碼如下: Date date=new Date(); SimpleDateFormat dateFormater = new SimpleDateFormat("yyyy-MM-dd"

SQL語句 年齡段分組統計人數

create table #t(Uname varchar(10),age int) insert #t select '啊啊',19 union all select '資訊',23 union

各種日期、時間段統計SQL語句

--前一日  select * from 表名 where  datediff(d,cast(日期  as  datetime),getdate())=1  --上週 select *

Mysql 根據時間年月日分組統計(做個收藏)

  create_time時間格式         SELECT DATE_FORMAT(create_time,'%Y%u') weeks,COUNT(id) COUNT FROM role GROUP BY weeks;         SELECT DATE_FO

Mysql 根據時間戳、時間年月日分組統計

下列修飾符可以被用在format字串中: %M 月名字(January……December) %W 星期名字(Sunday……Saturday) %D 有英語字首的月份的日期(1st, 2nd, 3rd, 等等。) %Y 年, 數字, 4 位 %y 年, 數字, 2 位 %a 縮寫的星期名字(Sun……Sat

PHP mysql 時間分組 表格table 跨度 rowspan

sele 時間 mode del select() code sel color distinct $cjrili_list = CjriliModel::select(); $cjrili_group = Db::q

mongodb按照時間分組統計

get text .com hour dateutil private sub agg pri 使用spring data mongodb v1.8需求1、數據結構如下。說明:改集合記錄的是公司各個系統的訪問情況(localPath表示系統,requestTime 表示請求

MySQL查詢時,將查詢時間更新為當前時間now()的sql語句寫法

ann 語句 author mysql查詢 使用 app 技術分享 select ima sql語句寫法: select a.id,a.title,a.doc_content,a.write_time,a.author,a.articletype,a.channelid,

Sqlite資料庫對時間進行比較SQL語句

開發工作,在於不斷積累,總結經驗,持續學習。 最近專案中有這樣的需求: 1、刪除當前月份前三個月訊息(如本月是10月刪除7、8、9三個月的訊息只儲存本月訊息)。 2、更新非本月訊息為已讀訊息(如本月為10月,1為已讀狀態,0為未讀狀態,10月的所有訊息狀態不變,非本月訊息狀態都為1)。

php 時間分組

/* * 按當前的月份 查出 之前的月份 每個月份的月初時間戳和月末時間戳 */ // $y = date('Y',time()); // $m = date('m',time()); // for ($i=1;$i<=$m;$i++){ // //

mongodb 計算季度 & 季度分組統計

    計算季度:   db.task.aggregate([{ $match: { "createDate": {$ne: null} } }, { $project: { status: 1, createDate: 1, qu

mongodb aggregate日期分組統計及spring mongo實現

如需轉載請註明出處: mongodb aggregate按日期分組統計及spring mongo實現 實現的需求 傳入毫秒級開始時間戳和結束的時間戳,根據當前狀態currentStatus.status和當前狀態時間currentStatus.datetime進行按日統計,缺少數

Oracle 時間段分組統計 (使用LEVEL)

想要按時間段分組查詢,首先要了解level,connect by,oracle時間的加減.  關於level這裡不多說,我只寫出一個查詢語句: ---level 是一個偽例  selectlevelfrom dual connectbylevel <=10    ---結果:1     2  

記錄一個mysql日期分組統計的查詢

SELECT DATE_FORMAT( deteline, "%Y-%m-%d %H" ) , COUNT( * ) FROM testGROUP BY DATE_FORMAT( deteline, "%Y-%m-%d %H" )  查詢某天: deteline, "%Y

學生各門課程成績統計SQL語句大全(面試題)

http://www.cnblogs.com/lsgcoder101/p/6011059.html 建立表 SET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOSET ANSI_PADDING ONGOCREATE TABLE

MYSQL關於時間日期的sql語句

            mysql> SELECT "1997-12-31 23:59:59" + INTERVAL 1 SECOND;              -> 1998-01-01 00:00:00              mysql> SELECT INTERVAL 1 DAY

Oracle 時間段分組統計

想要按時間段分組查詢,首先要了解level,connect by,oracle時間的加減. 關於level這裡不多說,我只寫出一個查詢語句: ---level 是一個偽例 select level from dual connect by level <=1

host 分組統計檢視 | 全方位認識 sys 系統庫

在上一篇《配置表|全方位認識 sys 系統庫》中,我們介紹了sys 系統庫的配置表,但實際上我們大部分人大多數時候並不需要去修改配置表,直接使用sys 系統庫下的檢視來獲取所需的資料即可,sys 系統庫下一共有100多檢視,這些檢視都能夠給我們提供一些什麼樣的資訊呢?本期的內