【问题标题】:SQL Query to Return Count Based on Time基于时间返回计数的 SQL 查询
【发布时间】:2014-07-18 23:06:25
【问题描述】:

我有一个有趣的问题,不确定如何编写查询来解决它。假设我有一个名为“汽车”的表。它有两列,CarId (int PK) 和 ArrivalTime (datetime)。当汽车进入一个空间时,就会输入到达时间。

我需要知道的是:对于每辆车,在它到达之前的 24 个时间段内有多少人进入了空间。

我想在不使用光标的情况下编写此代码,但不知道该怎么做。有任何 SQL 大师有想法吗?

哦 - 我应该提到正在使用的 SQL Server 版本是 2005。

【问题讨论】:

  • 样本数据将带您走得更远...帮助我们帮助您。
  • 我假设你的问题是——“我需要知道的是:对于每辆车,有多少“其他汽车”在它到达之前的 24 个时间段内进入同一空间。”

标签: sql sql-server


【解决方案1】:

您可以使用带有相关子查询或连接的查询。

这是一个使用连接操作的查询示例:

SELECT n.CarId
     , n.ArrivalDate
     , COUNT(p.CarId) AS cnt_previous_arrivals
  FROM cars n
  LEFT
  JOIN cars p
    ON p.CarId = n.CarId
   AND p.ArrivalDate >= DATEADD(HOUR,-24,n.ArrivalDate)
   AND p.ArrivalDate < n.ArrivalDate
 GROUP
    BY n.CarId
     , n.ArrivalDate

要获得具有相关子查询的等效结果,一种选择:

SELECT n.CarId
     , n.ArrivalDate
     , ( SELECT SUM(1) 
           FROM cars p 
          WHERE p.CarId = n.CarId
            AND p.ArrivalDate >= DATEADD(HOUR,-24,n.ArrivalDate)
            AND p.ArrivalDate < n.ArrivalDate
       ) AS cnt_previous_arrivals
  FROM cars n
 ORDER
    BY n.CarId
     , n.ArrivalDate

【讨论】:

  • 编辑:我在 JOIN 查询的 GROUP BY 子句中添加了 ArrivalDate(第一次错过了,并添加了一个相关子查询的示例)
  • 太棒了,谢谢!我曾经在 SQL 24/7 中工作。几年后损失了多少,真是令人惊讶。
【解决方案2】:
select el1.car_id,
       ( select count(*)
           from entry_log el2
          where el2.datetime between DATEADD(day, -1, el1.datetime)
                 and el1.datetime
             and el2.car_id != el1. car_id 
        )
  from entry_log el1
where el1.car_id = :my_car_id

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-06-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-11
    • 2013-06-11
    • 1970-01-01
    相关资源
    最近更新 更多