2017-04-27 47 views
0

我不是太熟悉SQL,因为我要求从专业人士的帮助:)如何使齿轮比的选择为每15分钟

我有的计算%的交易的成功率这样的说法,但它整天都在做 问题是:如何更改语句以便每15分钟返回不成功率的最大值?查看每15分钟的%以便了解哪个间隔是最大的不成功事务。

声明是在这里: Statement is here:

Test data

+0

看到引用知道链接,怎么问一个完美的问题:https://spaghettidba.com/2015/04/24/how-to-post-at-sql-question-on-a-public-forum/ – TheGameiswar

+0

请问您能否提供一些示例数据,这对我们有很大帮助 – Kevin

+0

嗨,我更新了链接的帖子,测试数据 –

回答

0

我不知道确切的输出是你想要的,但我想你可以用这个启动。

;WITH mCTE AS (
    SELECT p.*, CASE WHEN DATEPART(MINUTE, p.server_time) >=0 AND DATEPART(MINUTE, p.server_time) < 15 THEN '0...14' 
        WHEN DATEPART(MINUTE, p.server_time) >=15 AND DATEPART(MINUTE, p.server_time) < 30 THEN '15...29' 
        WHEN DATEPART(MINUTE, p.server_time) >=30 AND DATEPART(MINUTE, p.server_time) < 45 THEN '30...44' 
        WHEN DATEPART(MINUTE, p.server_time) >=45 AND DATEPART(MINUTE, p.server_time) < 60 THEN '45...59' 
       END AS mRange 
    FROM payments AS p) 

SELECT CONVERT(DATE, GETDATE()) AS ReportDate, 
    YEAR(p.server_time) AS ServerYear, 
    MONTH(p.server_time) AS ServerMonth, 
    DAY(p.server_time) AS ServerDay, 
    DATEPART(HOUR, p.server_time) AS ServerHour, 
    p.mRange AS ServerMinuteRange, 
    COUNT(p2._total)/NULLIF(COUNT(p1._total)/100.0, 0.0) AS Ratio 
FROM mCTE AS p 
LEFT OUTER JOIN mCTE AS p1 ON p.row_id = p1.row_id AND (p._state/1000) <> 0 
LEFT OUTER JOIN mCTE AS p2 ON p.row_id = p2.row_id AND (p._state/1000) = 1 AND p2.row_id IS NOT NULL 
WHERE CONVERT(DATE, p.server_time) = CONVERT(DATE, GETDATE()) 
GROUP BY YEAR(p.server_time), MONTH(p.server_time), DAY(p.server_time), DATEPART(HOUR, p.server_time), p.mRange 

结果

ReportDate ServerYear ServerMonth ServerDay ServerHour ServerMinuteRange Ratio 
2017-04-27 2017  4   27   13   0...14    0.000000000000000000 
2017-04-27 2017  4   27   13   15...29   18.181818181818181818 
2017-04-27 2017  4   27   13   30...44   0.000000000000000000 
2017-04-27 2017  4   27   13   45...59   0.000000000000000000 
2017-04-27 2017  4   27   14   0...14    18.181818181818181818 
2017-04-27 2017  4   27   14   15...29   0.000000000000000000 
2017-04-27 2017  4   27   14   30...44   0.000000000000000000 
2017-04-27 2017  4   27   14   45...59   0.000000000000000000 
2017-04-27 2017  4   27   15   0...14    0.000000000000000000 
2017-04-27 2017  4   27   15   15...29   0.000000000000000000 
2017-04-27 2017  4   27   15   30...44   0.000000000000000000 
2017-04-27 2017  4   27   15   45...59   0.000000000000000000 
2017-04-27 2017  4   27   16   0...14    0.000000000000000000 
2017-04-27 2017  4   27   16   15...29   0.000000000000000000 

UPDATE

对于每个三个小时,只是改变在CTE的逻辑和由子句

;WITH mCTE AS (
    SELECT p.*, CASE WHEN DATEPART(HOUR, p.server_time) >=0 AND DATEPART(HOUR, p.server_time) < 3 THEN '0...2' 
       WHEN DATEPART(HOUR, p.server_time) >= 3 AND DATEPART(HOUR, p.server_time) < 6 THEN '3...5' 
       WHEN DATEPART(HOUR, p.server_time) >= 6 AND DATEPART(HOUR, p.server_time) < 9 THEN '6...8' 
       WHEN DATEPART(HOUR, p.server_time) >= 9 AND DATEPART(HOUR, p.server_time) < 12 THEN '9...11' 
       WHEN DATEPART(HOUR, p.server_time) >= 12 AND DATEPART(HOUR, p.server_time) < 15 THEN '12...14' 
       WHEN DATEPART(HOUR, p.server_time) >= 15 AND DATEPART(HOUR, p.server_time) < 18 THEN '15...17' 
       WHEN DATEPART(HOUR, p.server_time) >= 18 AND DATEPART(HOUR, p.server_time) < 21 THEN '18...20' 
       WHEN DATEPART(HOUR, p.server_time) >= 21 AND DATEPART(HOUR, p.server_time) < 24 THEN '21...23' 
      END AS mRange 
    FROM payments AS p) 

SELECT CONVERT(DATE, GETDATE()) AS ReportDate, 
    YEAR(p.server_time) AS ServerYear, 
    MONTH(p.server_time) AS ServerMonth, 
    DAY(p.server_time) AS ServerDay, 
    p.mRange AS ServerHourRange, 
    COUNT(p2._total)/NULLIF(COUNT(p1._total)/100.0, 0.0) AS Ratio 
FROM mCTE AS p 
LEFT OUTER JOIN mCTE AS p1 ON p.row_id = p1.row_id AND (p._state/1000) <> 0 
LEFT OUTER JOIN mCTE AS p2 ON p.row_id = p2.row_id AND (p._state/1000) = 1 AND p2.row_id IS NOT NULL 
WHERE CONVERT(DATE, p.server_time) = CONVERT(DATE, GETDATE()) 
GROUP BY YEAR(p.server_time), MONTH(p.server_time), DAY(p.server_time), p.mRange 

从组中删除分钟结果

ReportDate ServerYear ServerMonth ServerDay ServerHourRange Ratio 
2017-04-28 2017  4   26   18...20   1.754385964912280701 
2017-04-28 2017  4   27   12...14   5.479452054794520547 
2017-04-28 2017  4   27   15...17   0.000000000000000000 

更新2

要只显示数据的最后3H你只需要改变WHERE子句

WHERE p.server_time >= DATEADD(HOUR, -3, GETDATE()) 
+0

谢谢,凯文看起来像加工!但是,如果我想看到相同的数据,但每3小时我需要在SQL语句中更改? –

+0

@AndrisSmits我用每3小时的逻辑更新了答案 – Kevin

+0

凯文,是的,非常感谢!它完美的作品!但最后一个请求 - 如何更改语句,以便仅显示最后3小时的值? –