22,210
社区成员
发帖
与我相关
我的任务
分享
;WITH ROWNUM AS
(
SELECT
R=ROW_NUMBER() OVER (ORDER BY A.FROMUSER,A.[TIMESTAMP])
,A.FROMUSER
,A.TIMESTAMP
FROM GL_G18_MSGSIGNALRECORD A
WHERE INSTYPE IN (0,1)
AND FROMTYPE=4
)
,TOTABLE AS
(
SELECT
E.REGIONNAME AS COLNAME,
SUM((CASE WHEN C.INSTYPE=0 AND B.INSTYPE=1 THEN DATEDIFF(S,C.[TIMESTAMP],B.[TIMESTAMP]) ELSE 0 END)) AS PVALUE
FROM ROWNUM C
INNER JOIN ROWNUM B ON C.R=B.R-1 AND B.FROMUSER=C.FROMUSER
INNER JOIN DG_ROBOT D ON B.FROMUSER=D.ROBOTCODE
INNER JOIN DG_REGION E ON D.REGIONCODE=E.REGIONCODE
GROUP BY REGION,ROBOT
)
SELECT TOP 5 COLNAME
FROM TOTABLE
GROUP BY COLNAME
ORDER BY SUM(PVALUE) DESC
WITH rownum AS (
SELECT r = Row_number() OVER(PARTITION BY fromuser -- 看下面 b、c 的连接条件,formuser 用错了
ORDER BY [timestamp]),
fromuser, [timestamp], instype -- 只列需要的字段
FROM gl_g18_msgsignalrecord
WHERE instype IN (0,1)
AND fromtype = 4
/* 有日期条件先在这里过滤 */
AND [timestamp] >= '2015-05-01'
AND [timestamp] < '2015-06-01'
)
,totable AS (
SELECT e.regionname AS colname,
SUM(Datediff(s,c.TIMESTAMP,b.TIMESTAMP)) AS pvalue
FROM rownum c
JOIN rownum b
ON b.fromuser = c.fromuser
AND c.r = b.r - 1
JOIN dg_robot d
ON b.fromuser = d.robotcode
JOIN dg_region e
ON d.regioncode = e.regioncode
WHERE c.instype = 0 -- 这两个作为过滤条件,而不是所有记录都参与统计
AND b.instype = 1
/* 如果有 robot 的过滤条件写在这里,不要出现在 SELECT 字段中
AND e.regioncode = 12345
*/
GROUP BY e.regionname -- 最终结果只有一个分组,就不要画蛇添足了
)
SELECT TOP 5 colname
FROM totable
ORDER BY pvalue DESC