Sql 如何选择每15分钟的比率

Sql 如何选择每15分钟的比率,sql,sql-server,Sql,Sql Server,我不太熟悉SQL,因为我正在寻求专业人士的帮助:) 我有这样一个报表,它以%计算交易的不成功率,但它是按全天计算的 问题是:如何更改语句,使其每15分钟返回不成功比率的最大值?每15分钟查看一次%以了解哪个时间间隔是最大不成功事务 声明如下: 我不知道您想要的确切输出是什么,但我想您可以从这个开始 ;WITH mCTE AS ( SELECT p.*, CASE WHEN DATEPART(MINUTE, p.server_time) >=0 AND DATEPART(MINUTE,

我不太熟悉SQL,因为我正在寻求专业人士的帮助:)

我有这样一个报表,它以%计算交易的不成功率,但它是按全天计算的 问题是:如何更改语句,使其每15分钟返回不成功比率的最大值?每15分钟查看一次%以了解哪个时间间隔是最大不成功事务

声明如下:


我不知道您想要的确切输出是什么,但我想您可以从这个开始

;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
更新

对于每三个小时,只需更改CTE中的逻辑并从GROUPBY子句中删除分钟数

;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
更新2

要仅显示最后3小时的数据,只需将WHERE子句更改为

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

看到链接参考了解,如何问一个完美的问题:你能提供一些样本数据请,这将有助于一个lotHi,我更新后的链接哪里是测试数据谢谢,凯文它看起来工作!但是如果我想看到相同的数据,但是每3小时我需要在sql语句中更改什么?@AndrisSmits我用每3小时的逻辑更新了答案凯文,是的,非常感谢!它工作得很好!但是最后一个请求-如何更改语句,使其仅显示最近3小时的值?
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
WHERE p.server_time >= DATEADD(HOUR, -3, GETDATE())