使用SQL服务器(Azure) 我有我的StartCalls和EndCalls表(日期+时间)。 我想建立一个数字游戏,每分钟都会依靠拨打的电话数(跟踪每分钟的电话号码数)
我的解决方案应该基于我的CountTable
CountTable
MinutStart,
MinuteEnd,
Range(1 to 60),
callsnumber
应该处理一小时内包含的所有会议记录
00:00:00-00:00:01 1 number,
00:00:01-00:00:02 2 number,
...
和
Where ( StartCalls > MinutStart )
and ( EndCalls < MinutEnd )
UPDATE Callsnumber = Callsnumber+1
希望有人能够解决这个问题并提供帮助^^
答案 0 :(得分:0)
好吧,我宁愿去寻找观点。
先决条件: 创建一个Number表,它将存储从1到xxx的数字
请参阅示例MessageEvent
然而,想法是计算通话的持续时间。 然后你可以有一个起始分钟,并且在此结束时呼叫不是,你计算下一分钟并按数字递增。
当然,你制作模数60以避免&#34;小时溢出&#34;问题
你当然可以做些更好的事情,但是你已经有了这个想法。
with calls as(
select
(datepart(minute, startDate) + number -1) % 60 as min1,
(datepart(minute, startDate) + number) % 60 as min2,
datediff(minute, startDate, endDate) as duration,
number
from <YourTable>
join Numbers n on n.Number <= datediff(minute, startDate, endDate)
)
select
min1,
min2,
count(*) as nbOfCalls
from calls
group by min1, min2
order by min1, min2
修改强>
如果您需要年/月/小时/分钟的详细信息,您可以
创建一个包含所有分钟的日历表,在这种情况下从2016-06-01开始(在这种情况下以2024结尾)。
SELECT TOP 5000000 N=IDENTITY(INT, 1, 1)
INTO dbo.Numbers
FROM master.dbo.syscolumns a CROSS JOIN master.dbo.syscolumns b;
ALTER TABLE dbo.Numbers ADD CONSTRAINT NBR_pk PRIMARY KEY(N);
select minutes = dateAdd(MINUTE, N, '2015-06-01')
into CalendarTable
from Numbers;
现在你可以做到
select
ct.minutes,
count(t.startDate) from
CalendarTable ct
left join <yourTable> t on ct.minutes BETWEEN DATEADD(mi, DATEDIFF(mi, 0, t.startDate), 0)
AND DATEADD(mi, DATEDIFF(mi, 0,t.EndDate), 0)
--where ct.minutes between '2016-10-03' and '2016-10-05' if you wanna test on an interval, put what you need here
group by minutes
order by minutes