當前位置:首頁 » 編程語言 » sql按7天分組
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

sql按7天分組

發布時間: 2022-12-26 17:04:16

『壹』 sql求解:查詢連續七天以上都有打卡的員工記錄

可以利用一下ORACLE的ROWNUM機制來做點文章,因為它是自增的
我假設有這一張表 WORK
ID,上班日期(DA)
1,20080101
1,20080102
1,20080103
2,20080101
2,20080103
3,20080101
也可能是亂序的
第一步:排序
SELECT * FROM WORK ORDER BY ID, DA
第二步:日期-ROWNUM如果相同的話認為他們是連續的,然後GORUP BY一下
SELECT A.*, TO_NUMBER (A.DA - ROWNUM) DAYS
FROM (SELECT * FROM WORK ORDER BY ID, DA) A
第三步:分別求出連續區間,讓他們相減求出大於6的值
SELECT C.ID
(SELECT B.ID, (MAX (B.DA) - MIN (B.DA)) DAYS
FROM (SELECT A.*, TO_NUMBER (A.DA - ROWNUM) DAYS
FROM (SELECT * FROM WORK ORDER BY ID, DA) A) B
GROUP BY B.ID, B.DAYS) C
WHERE C.DAYS > 7

ITPUB一位高人的辦法得到了啟發

『貳』 sqlserver中怎麼按星期分組

select datediff(week,'2008/01/01','2008/02/01')
試試看,兩個日期間的星期數,默認是周日到周六算一周的

不曉得你說的分組是什麼意思

『叄』 SQL 每七天為一組數據!

可以用datetime的week部分分組,每周一組
group by datepart(week,datecolumn)
如果需要調整起始日期,比如本來2010-12-16開始,要改成2010-12-17開始
group by datepart(week,dateadd(day,1,datecolumn))
sql server中測試,其他資料庫可找相關函數轉換。

『肆』 SQL每七天為一組數據

可以用datetime的week部分分組,每周一組
group by datepart(week,datecolumn)
如果需要調整起始日期,比如本來2010-12-16開始,要改成2010-12-17開始
group by datepart(week,dateadd(day,1,datecolumn))

select datecolumn=min(datecolumn) from table1 group by datepart(week,datecolumn)

『伍』 MYSQL查詢一周內的數據(最近7天的)怎麼寫

select * from wap_content where week(created_at) = week(now)

如果要嚴格要求是某一年的,那可以這樣

查詢一天:

select * from table where to_days(column_time) = to_days(now());

select * from table where date(column_time) = curdate();

查詢一周:

select * from table where DATE_SUB(CURDATE(), INTERVAL 7 DAY) <= date(column_time);

查詢一個月:

select * from table where DATE_SUB(CURDATE(), INTERVAL INTERVAL 1 MONTH) <=

date(column_time);

查詢一年:

select * from table where DATE_SUB(CURDATE(), INTERVAL 1 YEAR) <= date(column_time);

(5)sql按7天分組擴展閱讀

mysql查詢最近7天的數據:

1,(以當天為起點)

SELECT * FROM tb_equity e where DATE_SUB(CURDATE(), INTERVAL 6 DAY) <=

date(createdate)

2,(以資料庫最新的時間最為最近的一天)

SELECT * FROM tb_equity e where createdate > DATE_ADD((select createdate from tb_equity

ORDER BY createdate DESC limit 1) ,INTERVAL -7 day)

and (select createdate from tb_equity ORDER BY createdate DESC limit 1) >= createdate

3,sql查詢表中的重復數據

select * from 表名 where 欄位名 in (select 欄位名 from 表名 group by 欄位名 HAVING COUNT(*)

> 1) order by 表名

『陸』 SQL rownumber partition 取范圍數據進行分組

oracle中,分組後,取各組的前n條記錄的sql語句:rownumber() over()

row_number() OVER (PARTITION BY COL1 ORDER BY COL2) 表示根據COL1分組,在分組內部根據 COL2排序,而此函數計算的值就表示每組內部排序後的順序編號(組內連續的唯一的).與rownum的區別在於:使用rownum進行排序的時候是先對結果集加入偽列rownum然後再進行排序,而此函數在包含排序從句後是先排序再計算行號碼.
row_number()和rownum差不多,功能更強一點(可以在各個分組內從1開時排序).
rank()是跳躍排序,有兩個第二名時接下來就是第四名(同樣是在各個分組內).
dense_rank()l是連續排序,有兩個第二名時仍然跟著第三名。相比之下row_number是沒有重復值的 .
lag(arg1,arg2,arg3):
arg1是從其他行返回的表達式
arg2是希望檢索的當前行分區的偏移量。是一個正的偏移量,時一個往回檢索以前的行的數目。
arg3是在arg2表示的數目超出了分組的范圍時返回的值。

看幾個SQL語句:
語句一:
select row_number() over(order by sale/cnt desc) as sort, sale/cnt
from (
select -60 as sale,3 as cnt from al union
select 24 as sale,6 as cnt from al union
select 50 as sale,5 as cnt from al union
select -20 as sale,2 as cnt from al union
select 40 as sale,8 as cnt from al);

執行結果:
SORT SALE/CNT
---------- ----------
1 10
2 5
3 4
4 -10
5 -20

語句二:查詢員工的工資,按部門排序
select ename,sal,row_number() over (partition by deptno order by sal desc) as sal_order from scott.emp;
執行結果:
ENAME SAL SAL_ORDER
-------------------- ---------- ----------
KING 5000 1
CLARK 2450 2
MILLER 1300 3
SCOTT 3000 1
FORD 3000 2
JONES 2975 3
ADAMS 1100 4
SMITH 800 5
BLAKE 2850 1
ALLEN 1600 2
TURNER 1500 3
WARD 1250 4
MARTIN 1250 5
JAMES 950 6

已選擇14行。
語句三:查詢每個部門的最高工資
select deptno,ename,sal from
(select deptno,ename,sal,row_number() over (partition by deptno order by sal desc) as sal_order
from scott.emp) where sal_order <2;

執行結果:
DEPTNO ENAME SAL
---------- -------------------- ----------
10 KING 5000
20 SCOTT 3000
30 BLAKE 2850

已選擇3行。
語句四:
select deptno,sal,rank() over (partition by deptno order by sal) as rank_order from scott.emp order by deptno;
執行結果:
DEPTNO SAL RANK_ORDER
---------- ---------- ----------
10 1300 1
10 2450 2
10 5000 3
20 800 1
20 1100 2
20 2975 3
20 3000 4
20 3000 4
30 950 1
30 1250 2
30 1250 2
30 1500 4
30 1600 5
30 2850 6

已選擇14行。
語句五:
select deptno,sal,dense_rank() over(partition by deptno order by sal) as dense_rank_order from scott.emp order by deptn;執行結果:
DEPTNO SAL DENSE_RANK_ORDER
---------- ---------- ----------------
10 1300 1
10 2450 2
10 5000 3
20 800 1
20 1100 2
20 2975 3
20 3000 4
20 3000 4
30 950 1
30 1250 2
30 1250 2
30 1500 3
30 1600 4
30 2850 5

已選擇14行。
語句六:
select deptno,ename,sal,lag(ename,1,null) over(partition by deptno order by ename) as lag_ from scott.emp order by deptno;
執行結果:
DEPTNO ENAME SAL LAG_
---------- -------------------- ---------- --------------------
10 CLARK 2450
10 KING 5000 CLARK
10 MILLER 1300 KING
20 ADAMS 1100
20 FORD 3000 ADAMS
20 JONES 2975 FORD
20 SCOTT 3000 JONES
20 SMITH 800 SCOTT
30 ALLEN 1600
30 BLAKE 2850 ALLEN
30 JAMES 950 BLAKE
30 MARTIN 1250 JAMES
30 TURNER 1500 MARTIN
30 WARD 1250 TURNER

已選擇14行。

『柒』 sql查詢一張表前7天(不包括今天)每天的數據量,應該怎麼寫,時間格式YYYY-MM-DD HH:MM:SS。

按照你的問題,其實只需要這么寫就可以了:

select to_char(日期欄位,'yyyymmdd'),count(*) from 表 where 日期欄位>= trunc(sysdate)-7 and 日期欄位 < trunc(sysdate) group by to_char(欄位,'yyyymmdd') order by to_char(欄位,'yyyymmdd');

to_char(日期欄位,'yyyymmdd')是為了獲得記錄的日期,這樣就可以使用group by分組獲得數據

『捌』 sql語句按照日期分組怎麼寫

1.如果你的時間格式是2012-01-13 17:35:52.217這樣的形式,(主要是那個01不要是1),用下面這個
SELECT convert(varchar(10),時間,23),SUM(數字數據) FROM 表
group by convert(varchar(10),時間,23)
2.如果你的時間格式不是上面的格式,先轉化成datetime:
SELECT convert(varchar(10),cast(時間 as datetime),23) ,SUM(數字數據) FROM 表
group by convert(varchar(10),cast(時間 as datetime),23)
3.如果報錯,請追問~

『玖』 sql怎麼取出某一周的七天數據

setlanguageN'SimplifiedChinese'
selectdatename(weekday,數據添加日期列名)asdayOnweek,*from表名
wheredatediff(week,數據添加日期列名,'2014-11-1')=0

『拾』 oracle-sql如何查出:一段時間內(輸入時間區間),某數據,連續7天內出現5天及以上

我的大概想法和思路(本人無環境,所有內容都是臆想出來的,沒辦法測試)
(1)分組,因為是只要連續7天內5天即可,每天的次數並不重要,所以按照(人名和日期(不是時間是日期也就是截取到日)分組),這樣可以去掉每天重復的次數。
(2)分好組後的內容,按照人名和日期排序。這樣也就是說所有張三的都在一起,李四的都在一起,而且每個人的都是按照日期排序的。(這步其實不做也可以,因為下面的lead函數本身也可以分組排序,不過這樣說對你來說更直觀一些)
(3)利用lead函數(就是查某行數據的下幾行的函數,可能你沒有用過,我用的次數也不多。)往下查4行。
這個就是出現了5次,因為:四行+本身=5次,只要證明這5次發生在7天內就可以了。
(4)所以最後一步就是利用lead的列-原來的時間列小於等於6就可以了,只要小於等於6,那麼就符合條件(因為相減為7那麼是8天,所以要相減為6),就輸出。
我按照你給的數據,大概寫一個,不一定能用(什麼轉換之類的我都沒寫,所以基本肯定不能直接用),不過意思你大概應該能明白。
seelct * from
(select a.人名,a.日期,lead(a.日期,4,null)over(partition by 人名 order by q.日期) 五次後的日期 from
(select 人名,trunc(時間,'dd')日期 from table geoup by 人名,trunc(時間,'dd')) a
) b where b. 五次後的日期-b.日期<=6
大概就是這么個意思。
第二步select查出來的內容,應該類似
張三 2001-10-1 2001-10-7
張三 2001-10-2 null(按照現有的數據來說就是null,這樣就不能說是出現了5天了)
同樣下面的張三也都是null
李四 2001-10-4 2001-10-10
李四 2001-10-6 2001-10-11
李四 2001-10-8 2001-10-12