查询以在表中的间隔内计数
Posted
技术标签:
【中文标题】查询以在表中的间隔内计数【英文标题】:Query to count within intervals in a table 【发布时间】:2017-01-30 18:14:59 【问题描述】:我有这张桌子:
CREATE TABLE pgoals (
gname varchar(100) REFERENCES pplayers(name),
minute integer,
date date,
PRIMARY KEY (gname,minute,date) ) ;
桌子上显然有很多目标。
为此,我想获得一个查询,显示十分钟间隔内的进球数(1-10, 11-20, 21-30 etc.)
。但是,我不知道我该怎么做,除了我应该使用COUNT
命令。
有什么想法吗?
提前致谢!
【问题讨论】:
你试过group by吗?/ 样本数据和期望的结果会有所帮助 如果在前 59 秒内进球,会发生什么?那是第 0 分钟还是第 1 分钟? @YashveerSingh 还没有,遗憾的是我不知道如何使用 GROUP BY 进行间隔。我会知道如何精确地分组,但我想按 10 分钟的间隔对其进行分组。 @hacker1337ninja 检查我的回答,希望有用 【参考方案1】:这正是你所需要的,小巧优雅:
SELECT gname, date, CEILING(minute/10) AS minuteInterval
FROM pgoals
GROUP BY minuteInterval;
【讨论】:
我们确定语言是 php 还是 SQL Server?你也忘了聚合天花板函数,但我认为这是正确的方法 @scsimon 感谢您向我指出我忘记了 CEILING 是用于 SQL 服务器的【参考方案2】:这是一个带有临时计数表的左连接选项
Declare @pgoals table (gname varchar(100) , minute integer,date date)
Insert Into @pgoals values
('aa',4,'2016-01-01')
,('aa',10,'2016-01-01')
,('aa',15,'2016-01-01')
,('aa',25,'2016-01-01')
Select Interval = concat(N-9,' - ',N)
,Goals = count(minute)
From (Select Top 10 N=10*Row_Number() Over (Order By Number) From master..spt_values ) A
Left Join @pgoals B
on minute between N-9 and N
Group By N
返回
Interval Goals
1 - 10 2
11 - 20 1
21 - 30 1
31 - 40 0
41 - 50 0
51 - 60 0
61 - 70 0
71 - 80 0
81 - 90 0
91 - 100 0
【讨论】:
【参考方案3】:drop table pgoals;
CREATE TABLE pgoals (
gname varchar(100),
minute integer,
date date,
PRIMARY KEY (gname,minute,date) ) ;
insert into pgoals (gname ,[minute] , [date])values ('A',1,GETDATE())
insert into pgoals (gname ,[minute] , [date])values ('B',3,GETDATE());
insert into pgoals (gname ,[minute] , [date])values ('B',4,GETDATE()) ;
insert into pgoals (gname ,[minute] , [date])values ('B',5,GETDATE()) ;
insert into pgoals (gname ,[minute] , [date])values ('A',11,GETDATE()) ;
insert into pgoals (gname ,[minute] , [date])values ('A',13,GETDATE());
insert into pgoals (gname ,[minute] , [date])values ('B',14,GETDATE());
insert into pgoals (gname ,[minute] , [date])values ('B',15,GETDATE());
insert into pgoals (gname ,[minute] , [date])values ('A',23,GETDATE());
insert into pgoals (gname ,[minute] , [date])values ('A',33,GETDATE());
select date,
minute/10*10 at,
count(*)
from pgoals
group by date,
minute/10;
date at goals
2017-01-30 0 4
2017-01-30 10 4
2017-01-30 20 1
2017-01-30 30 1
【讨论】:
【参考方案4】:根据我想出的当前信息,请看看是否有帮助
declare @goal as table (Id int ,name nvarchar(5) , [minute] int, [date] datetime )
insert into @goal (Id ,name ,[minute] , [date])values (1,'A',1,GETDATE())
insert into @goal (Id ,name ,[minute] , [date])values (1,'B',3,GETDATE())
insert into @goal (Id ,name ,[minute] , [date])values (1,'B',4,GETDATE())
insert into @goal (Id ,name ,[minute] , [date])values (1,'B',5,GETDATE())
insert into @goal (Id ,name ,[minute] , [date])values (1,'A',11,GETDATE())
insert into @goal (Id ,name ,[minute] , [date])values (1,'A',13,GETDATE())
insert into @goal (Id ,name ,[minute] , [date])values (1,'B',14,GETDATE())
insert into @goal (Id ,name ,[minute] , [date])values (1,'B',15,GETDATE())
insert into @goal (Id ,name ,[minute] , [date])values (1,'A',23,GETDATE())
insert into @goal (Id ,name ,[minute] , [date])values (1,'A',33,GETDATE())
select count(*)as goals,name,
case when ([minute]/10) = 0 then 10 else (minute/10)*10 end as mints,
date from @goal group by minute,name,date
【讨论】:
【参考方案5】:rextester 链接:http://rextester.com/MSW83979
create table pgoals (
gname varchar(100)
, minute integer
, date date
, PRIMARY KEY (gname,minute,date)
);
insert into pgoals values
('a',1,'20170130')
,('a',9,'20170130')
,('a',12,'20170130')
,('a',14,'20170130')
,('a',34,'20170130')
,('a',54,'20170130');
查询
with m as (
select nf, nt
from (values (1,10),(11,20),(21,30),(31,40),(41,50),(51,60)) t(nf, nt)
)
select
[interval] ='('+convert(varchar(3),m.nf)+ '-' +convert(varchar(3),m.nt)+')'
, goals = count(g.minute)
from m
left join pgoals g on g.minute between m.nf and m.nt
group by m.nf, m.nt
order by m.nf
结果:
+----------+-------+
| interval | goals |
+----------+-------+
| (1-10) | 2 |
| (11-20) | 2 |
| (21-30) | 0 |
| (31-40) | 1 |
| (41-50) | 0 |
| (51-60) | 1 |
+----------+-------+
【讨论】:
以上是关于查询以在表中的间隔内计数的主要内容,如果未能解决你的问题,请参考以下文章
MySQL:在表中选择第一条记录,最后一条记录和 200 条均匀间隔的记录