当前位置:首页 » 编程语言 » 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