我有一张包含通话记录的表格。我需要根据电话号码可以到达的时隙为下次呼叫分配时隙。
该表的相关栏目是:
电话号码| CallTimeStamp
CallTimeStamp是一个日期时间对象。
我需要计算以下内容:
我已经解决了这些问题:
计算电话号码的电话号码是直接的。如果呼叫日志中存在一个号码,我知道它已被呼叫。在这种情况下,以下查询将为我提供每个号码的呼叫计数。
SELECT DISTINCT(PhoneNumber), COUNT(PhoneNumber) FROM tblCallLog
GROUP BY PhoneNumber
但是,我的问题是我需要根据该列本身的值更改字段Count(PhoneNumber)中的值。我该如何实现这一目标? (例如,如果Count(PhoneNumber)给我一个值> 20,我需要将它改为5)。
这是我完全被困难的地方,我正在寻找“数据库”的做事方式。
不幸的是,我无法摆脱我的思维迭代过程。例如,如果我正在汇总某个电话号码(比如'123456')和某个时段(比如说在0800-1000之间),我可以写一个这样的查询:
DECLARE @T1Start time = '08:00:00.0000'
DECLARE @T2End time = '10:00:00.0000'
SELECT COUNT(CallTimeStamp) FROM tblCallLog
WHERE PhoneNumber = '123456' AND FORMAT(CallTimeStamp, 'hh:mm:ss') >= @T1Start AND FORMAT(CallTimeStamp, 'hh:mm:ss') < @T2End
现在,我可以浏览表格中的每个不同电话号码,计算每个时段的值,然后为电话号码指定一个插槽值。但是,必须有一种不涉及我遍历数据库的方法。
所以,我正在寻找有关如何解决这个问题的建议。
由于
答案 0 :(得分:1)
您可以使用DATEPART功能获取工作日时段。 要计算时间段,您可以尝试将分钟数从一天开始除以并将其除以时间段的大小。它会返回你的插槽号码。您可以使用CASE语句将其转换为正确的字符串或外观表,以便存储插槽描述。
SELECT
PhoneNumber
, DATEPART(WEEKDAY, l.CallTimeStamp) AS DayOfWeekSlot
, DATEDIFF(MINUTE, CONVERT(DATE, l.CallTimeStamp), l.CallTimeStamp) / 120 AS TwoHourSlot /*You can change number of minutes to get different slot size*/
, COUNT(*) AS Count
FROM tblCallLog l
GROUP BY PhoneNumber
, DATEPART(WEEKDAY, l.CallTimeStamp)
, DATEDIFF(MINUTE, CONVERT(DATE, l.CallTimeStamp), l.CallTimeStamp) / 120
答案 1 :(得分:0)
您可以尝试此操作来返回电话号码,星期几和2小时的时段。如果呼叫量大于20,则该值设置为5(不确定为什么为5?)。 2小时部分的代码改编自此问题How to Round a Time in T-SQL,其中(24/2)中的值2是您的时间段内的小时数。
SELECT
PhoneNumber
, DATENAME(weekday,CallTimeStamp) as [day]
, CONVERT(smalldatetime,ROUND(CAST(CallTimeStamp as float) * (24/2),0)/(24/2)) AS RoundedTime
, CASE WHEN COUNT(*) > 20 THEN 5 ELSE COUNT(*) END
FROM
tblCallLog
GROUP BY
PhoneNumber
, DATENAME(weekday,dateadd(s,start_ts,'01/01/1970'))