【问题标题】:Count last 10 data for each minute每分钟计算最后 10 个数据
【发布时间】:2017-10-31 13:42:57
【问题描述】:

我正在尝试编写一个 SQL 查询,该查询必须返回每分钟在过去 10 分钟内进行了多少事务。喜欢:

1 分钟前:2 笔交易

2 分钟前:1 笔交易

...

9 分钟前:3 笔交易

10 分钟前:4 笔交易

我试图做这个查询:

 DECLARE @N int =  10;
 DECLARE @NOW DATETIME =  GETDATE();

 WITH numbers( num ) AS (
     SELECT 1 UNION ALL
     SELECT 1 + num FROM numbers WHERE num < @N )

 SELECT num AS minute,
 ( 
     SELECT COUNT(*) AS RESULTS
     FROM  [ApiTransactions] 
     WHERE [DateUtc] > DATEADD(year, -1, @NOW)
     GROUP BY DATEPART(minute, DATEADD(minute, -num, @NOW))

 )
 FROM numbers;

我仍然不知道逻辑是否正确。我所知道的是我收到了错误:

每个 GROUP BY 表达式必须至少包含一个不是外部引用的列。

为什么会出现这个错误?有没有更好的查询方法?

【问题讨论】:

    标签: sql sql-server datetime group-by


    【解决方案1】:

    您不需要为此使用数字表,除非您需要填写没有交易的时间。我会从这个开始:

    SELECT DATEADD(minute, DATEDIFF(minute, 0, DateUtc), 0) as the_minute, COUNT(*)
    FROM ApiTransactions
    WHERE DateUtc > DATEADD(minute, -10, DateUtc)
    GROUP BY DATEADD(minute, DATEDIFF(minute, 0, DateUtc), 0)
    ORDER BY the_minute;
    

    【讨论】:

    • DATEADD 不是 DATADD。 2倍。仅供参考。
    【解决方案2】:

    你可以用这个:

    SELECT  DATEDIFF(minute,[DateUtc],GETDATE()) as minutes_ago,
            COUNT(*) tran_count 
    FROM ApiTransactions
    WHERE DATEDIFF(second,[DateUtc],GETDATE()) <= 600 -- 10 minutes ago
    GROUP BY DATEDIFF(minute,[DateUtc],GETDATE())
    

    输出:

    minutes_ago tran_count
    0           2
    1           3
    2           10
    3           15
    4           4
    5           9
    6           12
    7           6
    8           13
    9           4
    10          2
    

    【讨论】:

      【解决方案3】:

      我设法以两种不同的方式解决了我的问题:

      DECLARE @N int =  10;
      DECLARE @NOW DATETIME = GETDATE();
      
      WITH numbers( num ) AS (
      SELECT 1 UNION ALL
      SELECT 1 + num FROM numbers WHERE num < @N )
      
      SELECT num-1 AS minute,
      ( 
      
      SELECT COUNT(*) AS RESULTS
      FROM  [ApiTransactions] 
      WHERE [DateUtc] > DATEADD(minute, -num, @NOW) AND [DateUtc] < DATEADD(minute, -num+1, @NOW)
      
      )
      FROM numbers;
      

      作为输出:

      minutes_ago    amount 
      0               4             (most recents. still being updated)
      
      1               0
      
      2               2
      
      3               3
      
      4               1
      
      5               2
      
      6               1
      
      7               2
      
      8               1
      
      9               3
      

      并与:

      DECLARE @NOW DATETIME = GETDATE();
      SELECT CONVERT(int, DATEDIFF(second, [DateUtc], @NOW)/60) as TimePassed, COUNT([TypeCode]) as Amount
      FROM [ApiTransactions]
      WHERE [DateUtc] >= DATEADD (minute, -10 , @NOW)
      GROUP BY CONVERT(int, DATEDIFF(second, [DateUtc], @NOW)/60)
      ORDER BY  CONVERT(int, DATEDIFF(second, [DateUtc], @NOW)/60)
      

      作为输出:

      minutes_ago    amount 
      0               4             (most recents. still being updated)
      
      2               2
      
      3               3
      
      4               1
      
      5               2
      
      6               1
      
      7               2
      
      8               1
      
      9               3
      

      【讨论】:

        猜你喜欢
        • 2016-09-28
        • 2022-01-11
        • 2019-07-03
        • 1970-01-01
        • 2021-12-10
        • 1970-01-01
        • 1970-01-01
        • 2023-03-16
        • 1970-01-01
        相关资源
        最近更新 更多