【问题标题】:MSSQL query: How to count by every 2 hours (dynamic)?MSSQL 查询:如何每 2 小时计数一次(动态)?
【发布时间】:2018-03-06 10:00:46
【问题描述】:

我是这个网站的新手,找不到类似的问题,也不确定这是否可以在 SQL 中查询,但是,到底是什么,值得一试...

我有一个访问控制系统,它将条目日志写入我的数据库。 附上我的数据表中的示例:

tpxID   Rec_Creation_Date
2995392 2018-03-06 11:50:45.000
2995391 2018-03-06 11:39:48.000
2995390 2018-03-06 11:30:58.453
2995389 2018-03-06 11:30:49.297
2995388 2018-03-06 11:30:30.687
2995387 2018-03-06 11:30:22.547
2995386 2018-03-06 11:30:13.483
2995385 2018-03-06 11:30:04.813
2995384 2018-03-06 11:29:57.640
2995383 2018-03-06 11:29:49.670

我的想法是,我想知道是否有 2 小时的时间范围内我有超过 200 个条目?

我的意思是动态查询,它不会只查看圆形时间。

不仅可以查询11:00-13:00,还可以查询11:01-13:01和11:02-13:02等...

提前致谢。

【问题讨论】:

  • SQL SERVER - Group records by n minutes interval 的可能重复项(请注意,链接是针对分钟的,但这是从分钟更改为小时的简单案例。
  • 您是否必须按TpxID 对它们进行分组,或者您需要为特定日期找到一个 2 小时的窗口?
  • @BHouse,我不必将它们按 tpxID 分组,但也没有具体日期。
  • @Larnu,这不是重复的,希望是这样,在那个主题中,他们正在讨论几个小时,这不是我的情况的解决方案
  • 我认为您需要在此处添加 consumable 示例数据和预期结果集。

标签: sql sql-server


【解决方案1】:
select t1.dt, count(*) as cnt 
from table t1 
join table t2 
  on t2.dt > t1.dt 
 and datediff(mi, t1.dt, t2.dt) < 120 
group by t1.dt 
having count(*) > 200

【讨论】:

  • 没有解决我的问题,它只是对特定日期范围内的所有条目进行降序计数。
  • mi 进行了编辑,现在对我有用。认为需要进行另一个编辑:tw 应该是 t2 - 我无法编辑,因为编辑需要至少 6 个字符!
  • 如果这是答案,你可以给它打勾
【解决方案2】:

为此,我们可以使用CTEGROUP BYHAVING -

declare @xyz table (id int identity(1,1),tpxID int,Rec_Creation_Date datetime)

insert into @xyz (tpxID, Rec_Creation_Date)
select 2995392, '2018-03-06 11:50:45.000' union all
select 2995391, '2018-03-06 11:39:48.000' union all
select 2995390, '2018-03-06 11:30:58.453' union all
select 2995389, '2018-03-06 11:30:49.297' union all
select 2995388, '2018-03-06 11:30:30.687' union all
select 2995387, '2018-03-06 11:30:22.547' union all
select 2995386, '2018-03-06 11:30:13.483' union all
select 2995385, '2018-03-06 11:30:04.813' union all
select 2995384, '2018-03-06 11:29:57.640' union all
select 2995383, '2018-03-06 11:29:49.670' union all
select 2995383, '2018-03-06 09:29:49.670'

;with cte as (
    select
        x.Rec_Creation_Date as StartDT,
        y.Rec_Creation_Date as EndDT
    from @xyz as x
    inner join @xyz as y on x.Rec_Creation_Date < y.Rec_Creation_Date
    where datediff(HOUR,x.Rec_Creation_Date, y.Rec_Creation_Date) >= 2
)
select
    cte.StartDT,
    cte.EndDT
from cte
inner join @xyz as x on x.Rec_Creation_Date between cte.StartDT and cte.EndDT
group by cte.StartDT , cte.EndDT
having count(*) > 200
order by cte.StartDT , cte.EndDT

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-01-30
    • 2011-05-19
    • 1970-01-01
    • 1970-01-01
    • 2011-09-19
    • 1970-01-01
    • 2016-09-12
    • 1970-01-01
    相关资源
    最近更新 更多