SELECT MAX(AA.GROUPS), AA.TYPE_ID
公司主營業(yè)務(wù):成都網(wǎng)站建設(shè)、做網(wǎng)站、移動網(wǎng)站開發(fā)等業(yè)務(wù)。幫助企業(yè)客戶真正實現(xiàn)互聯(lián)網(wǎng)宣傳,提高企業(yè)的競爭能力。創(chuàng)新互聯(lián)是一支青春激揚(yáng)、勤奮敬業(yè)、活力青春激揚(yáng)、勤奮敬業(yè)、活力澎湃、和諧高效的團(tuán)隊。公司秉承以“開放、自由、嚴(yán)謹(jǐn)、自律”為核心的企業(yè)文化,感謝他們對我們的高要求,感謝他們從不同領(lǐng)域給我們帶來的挑戰(zhàn),讓我們激情的團(tuán)隊有機(jī)會用頭腦與智慧不斷的給客戶帶來驚喜。創(chuàng)新互聯(lián)推出鎮(zhèn)坪免費做網(wǎng)站回饋大家。
FROM (SELECT TRUNC((ROWNUM - 1) / 12) + 1 AS GROUPS,
MAX(A.TYPE_ID) TYPE_ID
FROM TABLENAME A
GROUP BY TRUNC((ROWNUM - 1) / 12) + 1
ORDER BY GROUPS) AA
GROUP BY AA.TYPE_ID
HAVING COUNT(1) 1;
首先你的starttime是什么類型的,數(shù)字?字符?還是時間?
要出來08:00-08:30這種結(jié)果簡單,只要查詢的時候加一個關(guān)聯(lián)就可以,
比如select starttime||'-'||endtime from table.當(dāng)然試過是時間的字段類型,比如date什么的,那就轉(zhuǎn)換成字符型的,反正現(xiàn)在看來主要是字符型。
再說分組,分組可以用case when手動分組。
按照你給的圖片個人覺得可以這么分
select case when starttime=0800 and endtime=10:00 then 1
when starttime=0900 and endtime=12:00 then 2
when starttime=1330 and endtime=15:30 then 3
when starttime=1530 and endtime=17:30 then 4
end 分組, starttime||'-'||endtime from table
這個語句中的具體寫法,可能會因為數(shù)據(jù)類型的原因什么的,導(dǎo)致語句不能直接用,需要轉(zhuǎn)換一下數(shù)據(jù)類型,但是大體上的意思和寫法就是這樣了。
Oracle按不同時間分組統(tǒng)計的sql
如下表table1:
日期(exportDate)
數(shù)量(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
注意:為了顯示更直觀,如下查詢已皆按相應(yīng)分組排序
1.按年份分組
select
to_char(exportDate,'yyyy'),sum(amount)
from
table1
group
by
to_char(exportDate,'yyyy');
年份
數(shù)量
-----------------------------
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');
月份
數(shù)量
-----------------------------
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');
季度
數(shù)量
------------------------------
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');
周
數(shù)量
------------------------------
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
PS:Oracle按時間段分組統(tǒng)計
想要按時間段分組查詢,首先要了解level,connect
by,oracle時間的加減.
關(guān)于level這里不多說,我只寫出一個查詢語句:
----level
是一個偽例
select
level
from
dual
connect
by
level
=10
---結(jié)果:
1
2
3
4
5
6
7
8
9
10
oracle時間的加減看看試一下以下sql語句就會知道:
select
sysdate
-1
from
dual
----結(jié)果減一天,也就24小時
select
sysdate-(1/2)
from
dual
-----結(jié)果減去半天,也就12小時
select
sysdate-(1/24)
from
dual
-----結(jié)果減去1
小時
select
sysdate-((1/24)/12)
from
dual
----結(jié)果減去5分鐘
select
sydate-(level-1)
from
dual
connect
by
level=10
---結(jié)果是10間隔1天的時間
下面是本次例子:
select
dt,
count(satisfy_degree)
as
num
from
T_DEMO
i
,
(select
sysdate
-
(level-1)
*
2
dt
from
dual
connect
by
level
=
10)
d
where
i.satisfy_degree='satisfy_1'
and
i.insert_timedt
and
i.insert_time
d.dt-2
group
by
d.dt
例子中的sysdate
-
(level-1)
*
2得到的是一個間隔是2天的時間
group
by
d.dt
也就是兩天的時間間隔分組查詢
自己實現(xiàn)例子:
create
table
A_HY_LOCATE1
(
MOBILE_NO
VARCHAR2(32),
LOCATE_TYPE
NUMBER(4),
AREA_NO
VARCHAR2(32),
CREATED_TIME
DATE,
AREA_NAME
VARCHAR2(512),
);
select
(sysdate-13)-(level-1)/4
from
dual
connect
by
level=34
--從第一條時間記錄開始(sysdate-13)為表中的最早的日期,“34”出現(xiàn)的分組數(shù)(一天按每六個小時分組
就應(yīng)該為4)
一下是按照每6個小時分組
select
mobile_no,area_name,max(created_time
),dt,
count(*)
as
num
from
a_hy_locate1
i
,
(select
(sysdate-13)-(level-1)/4
dt
from
dual
connect
by
level
=
34)
d
where
i.locate_type
=
1
and
i.created_timedt
and
i.created_time
d.dt-1/4
group
by
mobile_no,area_name,d.dt
另外一個方法:
--按六小時分組
select
trunc(to_number(to_char(created_time,
'hh24'))
/
6),count(*)
from
t_test
where
created_time
trunc(sysdate
-
40)
group
by
trunc(to_number(to_char(created_time,
'hh24'))
/
6)
--按12小時分組
select
trunc(to_number(to_char(created_time,
'hh24'))
/
6),count(*)
from
t_test
where
created_time
trunc(sysdate
-
40)
group
by
trunc(to_number(to_char(created_time,
'hh24'))
/
6)
CREATE??TABLE??info?(
users????varchar(100)
);
INSERT?INTO?info?VALUES('userA@userB@userC');
INSERT?INTO?info?VALUES('userB@userC@userD');
INSERT?INTO?info?VALUES('userC@userD@userE');
COLUMN?"用戶"?FORMAT?A15
SELECT
to_char(strvalue)?as?"用戶",
count(*)?AS?"用戶數(shù)"
FROM
info,
table(fn_split(?info.users,??'@'))
GROUP?BY
to_char(strvalue)
ORDER?BY
1;
用戶????????????????用戶數(shù)
---------------?----------
userA????????????????????1
userB????????????????????2
userC????????????????????3
userD????????????????????2
userE????????????????????1
上面這樣的效果, 是否滿足你的需求?
如果滿足的話, 你再往下看, 下面是 存儲過程的相關(guān)代碼
Oracle?需要首先在數(shù)據(jù)庫中,?創(chuàng)建好?類型?與?函數(shù)。
來實現(xiàn)一個??split?功能的處理。
--?定義一個對象類型.
CREATE?OR?REPLACE?TYPE?ty_row_str_split?as?object?(strValue?VARCHAR2?(4000));
/
--?定義一個?表/數(shù)組類型,?內(nèi)容是前面定義的那個對象.
CREATE?OR?REPLACE?TYPE?ty_tbl_str_split?IS?TABLE?OF?ty_row_str_split;
/
--------------------
--?字符分割函數(shù).
--?參數(shù)1:??被分割的源字符串
--?參數(shù)2:??用于拆分的字符串。
--------------------
CREATE?OR?REPLACE?FUNCTION?fn_split(
p_str???????IN?VARCHAR2,
p_delimiter?IN?VARCHAR2)
RETURN?ty_tbl_str_split?IS
j?????????INT?:=?0;
i?????????INT?:=?1;
--?被分割的源字符串?的長度.
len???????INT?:=?0;
--?分隔字符串的長度
len1??????INT?:=?0;
--?暫存的中間每一個單元的文本信息.
str???????VARCHAR2(4000);
--?預(yù)期返回結(jié)果.
str_split?ty_tbl_str_split?:=?ty_tbl_str_split();
BEGIN
--?被分割的源字符串?的長度.
len???:=?LENGTH(p_str);
--?分隔字符串的長度.
len1?:=?LENGTH(p_delimiter);
--?遍歷?被分割的源字符串.
WHILE?j??len?LOOP
--?在被分割的源字符串中,?查詢?分隔字符串.
j?:=?INSTR(p_str,?p_delimiter,?i);
IF?j?=?0?THEN
--?j=0?意味著沒有找到.
??--?可以理解為是查詢到最后一個單元了.
??--?設(shè)置?j?:=?len,?讓外部的循環(huán)處理可以結(jié)束了.
j??:=?len;
--?獲取最后一個單元的內(nèi)容.
str?:=?SUBSTR(p_str,?i);
--?結(jié)果追加一行.
str_split.EXTEND;
--?設(shè)置結(jié)果內(nèi)容.
str_split(str_split.COUNT)?:=?ty_row_str_split(strValue?=?str);
IF?i?=?len?THEN
EXIT;
END?IF;
ELSE
--?如果在被分割的源字符串中,找到了?分隔字符串.
--?首先,獲取分割的內(nèi)容.
str?:=?SUBSTR(p_str,?i,?j?-?i);
--?然后設(shè)置索引,?下一次再查找的時候,從指定的索引位置開始(不是從0開始找了)
i?:=?j?+?len1;
--?結(jié)果追加一行.
str_split.EXTEND;
--?設(shè)置結(jié)果內(nèi)容.
str_split(str_split.COUNT)?:=?ty_row_str_split(strValue?=?str);
END?IF;
END?LOOP;
RETURN?str_split;
END?fn_split;
/
函數(shù)創(chuàng)建完畢以后,可以開始做查詢的處理.
SQL?select?to_char(strvalue)?as?Value?from?table(fn_split('aa,bb,cc',','));
VALUE
-------------------------------------------------------------------------------
aa
bb
cc
oracle數(shù)據(jù)庫的分組查詢語句,主要是根據(jù)一個字段,使用關(guān)鍵字group
by來分組,如下代碼:
select to_char(date_column, 'yyyy-Q'),count(*)
from xxx
where date_column between '01-Jan-2007' and '31-Dec-2009'
group by to_char(date_column, 'yyyy-Q')//分組查詢
常用的函數(shù)有:
1、COUNT ()返回查尋的行數(shù)
例如:select count(*) from table;
2、MAX() 返回表達(dá)式的最大值
例如:select a, max(b) from table group by a;
3、MIN() 返回表達(dá)式的最小值
例如:select a, min(b) from table group by a;
4、SUM() 返回表達(dá)式的總合
例如:select a, sum(b) from table group by a;
5、AVG() 返回表達(dá)式的平均值
例如:select a, avg(b) from table group by a。
函數(shù)
函數(shù)在數(shù)學(xué)上的定義:給定一個非空的數(shù)集A,對A施加對應(yīng)法則f,記作f(A),得到另一數(shù)集B,也就是B=f(A).那么這個關(guān)系式就叫函數(shù)關(guān)系式,簡稱函數(shù)。