sign db_username db_ip beginTime endTime
downloadFiles tom 125.92.142.224 1378063471 1378063472
downloadFiles tom 125.92.142.224 1378072128 1378072129
downloadFiles tom2 84.14.196.239 1378077892 1378077893
downloadFiles tom2 84.14.196.239 1378077893 1378077894
downloadFiles tom2 84.14.196.239 1378077894 1378077895
downloadFiles tom2 84.14.196.239 1378077895 1378077896
downloadFiles tom2 84.14.196.239 1378077896 1378077897
downloadFiles tom2 84.14.196.239 1378077897 1378077898
downloadFiles tom2 84.14.196.239 1378079181 1378079182
downloadFiles tom2 84.14.196.239 1378079181 1378079182
downloadFiles tom2 84.14.196.239 1378079182 1378079183
downloadFiles tom2 84.14.196.239 1378079182 1378079183
downloadFiles tom2 84.14.196.239 1378079184 1378079185
downloadFiles tom2 84.14.196.239 1378079184 1378079185
downloadFiles tom2 84.14.196.239 1378079184 1378079185
downloadFiles tom2 84.14.196.239 1378079185 1378079186
downloadFiles tom2 84.14.196.239 1378079185 1378079186
downloadFiles tom2 84.14.196.239 1378079185 1378079186
downloadFiles tom2 84.14.196.239 1378079188 1378079189
downloadFiles tom2 84.14.196.239 1378079188 1378079189
downloadFiles tom2 84.14.196.239 1378079189 1378079190
downloadFiles tom2 84.14.196.239 1378079190 1378079191
downloadFiles tom2 84.14.196.239 1378079190 1378079191
downloadFiles tom2 84.14.196.239 1378079191 1378079192
downloadFiles tom2 84.14.196.239 1378079192 1378079193
我数据库里有这样的数据(关于时间值,我己转为unix 时间戳,方便比较)
现在我想要查询一个用户不重复的时间段的总和(如有重复的时间段,不计入总和,只计一次)
如 tom 第一条 为 2013-09-11 18:22:34 as T1 2013-09-11 18:22:54 as T2
第二条 为 2013-09-11 18:23:34 as T3 2013-09-11 18:24:54 as T4
SUM=(T2-T1)+(T4-T3) boz T3>T2
如果 第二条 为 2013-09-11 18:24:00 as T3 2013-09-11 18:24:54 as T4
SUM=(T4-T1) boz T3T1
如果 第二条 为 2013-09-11 18:22:37 as T3 2013-09-11 18:22:50 as T4
sum=T2-T1 boz T3<T1 && T4<T1
想将各个用户的时间段总和求出来
结果集为
downloadFiles tom 125.92.142.224 TotalTime 15(seconds)
downloadFiles tom2 84.14.196.239 TotalTime 309(seconds)
分组为sign/username/ip
想用一句SQL或存储过程实现
避免用通过loop来累积时间段总和,效率又太低了
大家有什么好的办法呢
如己加了标签 2013-09-11 18:22:34 as T1 2013-09-11 18:22:54 as T2
但新记录为 2013-09-11 18:18:34 as T3 2013-09-11 18:23:54 as T4
又要重新算总值
我的目的,是求一個用戶,傳輸文件的總時間,但不要重復的時間段
如3到5點,傳一百個文件,不能sum(100*2) 只能2 h
一個文件是2:00-3:00 別一個文件是 2:30-3:00 total 為 3-2=1
一個文件是2:00-3:00 別一個文件是 2:30-3:30 total 為 3.5-2=1.5
该回答引用ChatGPT
您可以使用 SQL 语句来实现这个需求。在具体实现上,需要使用分组和窗口函数。
首先需要对数据进行分组,然后使用窗口函数来排序数据,最后使用窗口函数的 lead 函数来比较两个时间段的关系。
如果两个时间段不重叠,那么它们的差值就可以累加到结果集中;如果两个时间段重叠,则只将其中较短的时间段的差值累加到结果集中。
下面是使用 SQL Server 实现的代码:
WITH CTE AS (
SELECT
sign,
db_username,
db_ip,
beginTime,
endTime,
ROW_NUMBER() OVER (PARTITION BY sign, db_username, db_ip ORDER BY beginTime) AS row_num,
LEAD(beginTime) OVER (PARTITION BY sign, db_username, db_ip ORDER BY beginTime) AS next_beginTime
FROM
your_table
)
SELECT
sign,
db_username,
db_ip,
SUM(CASE
WHEN next_beginTime IS NULL THEN endTime - beginTime
WHEN next_beginTime > endTime THEN endTime - beginTime
ELSE next_beginTime - beginTime
END) AS totalTime
FROM
CTE
GROUP BY
sign,
db_username,
db_ip