【问题标题】:Getting datetime count range in SQL Server在 SQL Server 中获取日期时间计数范围
【发布时间】:2022-02-09 08:08:21
【问题描述】:

我尝试获取 SQL Server 中数据更改之间的日期范围 我的查询是

select count(1) as qty, Info, convert(char,dFError,100) dErr
from TableData
group by Info, convert(char,dFError,100) 
order by dErr asc

我有这个 qty 是对服务器的请求数,info 是服务器 ip 和请求发送到另一台服务器的日期。

qty Info dErr
1 1.97 Aug 11 2021 9:01AM
1 1.97 Aug 11 2021 9:06AM
88 1.33 Dec 21 2021 2:04PM
1 1.95 Dec 22 2021 9:44PM
9 1.95 Dec 22 2021 9:45PM
1 1.33 Dec 22 2021 9:51PM
19 1.33 Dec 22 2021 9:52PM
3 1.33 Dec 22 2021 9:53PM
6 1.33 Dec 27 2021 7:10PM
17 1.33 Dec 27 2021 7:11PM
15 1.95 Dec 27 2021 7:17PM
8 1.95 Dec 27 2021 7:18PM

我想要这个,在 8 月 11 日上午 9:06 都将到 1.97,在 12 月 21 日下午 2:04 所有将到 1.33,这意味着日期和信息

qty Info dErr
2 1.97 Aug 11 2021 9:06AM
88 1.33 Dec 21 2021 2:04PM
10 1.95 Dec 22 2021 9:45PM
46 1.33 Dec 27 2021 7:11PM
23 1.95 Dec 27 2021 7:18PM

同一天可以是同一组不同时间的数字

qty Info dErr
1 1.97 Jan 24 2022 9:39AM
1 1.97 Jan 24 2022 9:51AM
1 1.97 Jan 24 2022 9:58AM
4 1.97 Jan 24 2022 10:08AM
1 1.97 Jan 24 2022 10:12AM
8 1.95 Jan 24 2022 10:24AM
2 1.95 Jan 24 2022 10:32AM
10 1.33 Jan 24 2022 10:33AM
1 1.33 Jan 24 2022 11:37AM
8 1.95 Jan 24 2022 11:59AM
1 1.95 Jan 24 2022 12:00PM
2 1.95 Jan 24 2022 12:08PM

并且需要像这样显示

qty Info dErr
8 1.97 Jan 24 2022 10:12AM
10 1.95 Jan 24 2022 10:32AM
11 1.33 Jan 24 2022 11:37AM
11 1.95 Jan 24 2022 12:08PM

【问题讨论】:

  • 你看过summaxgroup by吗?
  • 请编辑您的问题,显示您到目前为止所做的尝试。
  • 您提供的查询使用了“我想要这个”中其他地方没有看到的列。请提供一个查询和与之相关的数据,以及一个问题和 DDL。
  • 是的,我尝试了 sum、max、group by,但我无法得到我需要的东西,我添加了更多信息并进行更正

标签: sql sql-server database tsql gaps-and-islands


【解决方案1】:

双row_number 可用于计算排名。
然后可以在聚合中使用排名来解决这种 Gaps-And-Islands 类型的问题。

select sum(qty) as qty, Info, max(dFError) as dErr
from (
  select Info, dFError, qty
  , convert(date, dFError) as dErrorDate
  , Rnk = row_number() over (order by dFError)
  + row_number() over (partition by Info order by dFError desc)
  from TableData
) q
group by Info, Rnk
order by dErr;
qty Info dErr
2 1.97 2021-08-11 09:06:00.000
88 1.33 2021-12-21 14:04:00.000
10 1.95 2021-12-22 21:45:00.000
46 1.33 2021-12-27 19:11:00.000
23 1.95 2021-12-27 19:18:00.000
8 1.97 2022-01-24 10:12:00.000
10 1.95 2022-01-24 10:32:00.000
11 1.33 2022-01-24 11:37:00.000
11 1.95 2022-01-24 12:08:00.000

dbfiddle here

上的演示

【讨论】:

  • 太棒了!也就是说,我不擅长 row_number 我会尝试阅读更多相关信息
  • 这样的窗口函数还有很多。和here's an example 的另一种解决此类问题的方法。
【解决方案2】:
select 
    SUM(P_COUNT) as "COUNT", 
    P_DATA as "DATA", 
    MAX(FECHA) as "FECHA"
from 
    TABLEA
GROUP BY 
    P_DATA, CONVERT(DATE, FECHA)
ORDER BY "FECHA"

【讨论】:

  • 这只是给我最后的日期,但有时值是交织在一起的,比如 > 8 1.95 Jan 24 2022 10:24AM >2 1.95 Jan 24 2022 10:32AM >10 1.33 Jan 24 2022上午 10:33 >1 2022 年 1 月 24 日 1.33 上午 11:37 >8 2022 年 1 月 24 日 1.95 上午 11:59 >1 2022 年 1 月 24 日 1.95 下午 12:00
【解决方案3】:

您的预期结果与给定数据不匹配 - 在第一组中,您有 12/22 的行,1.33 和 1.95,但未包含在您的预期结果中。

在我看来,您想按日期分组 - 或按日期\小时。以下是两者的示例:

Declare @testTable table (qty int, Info numeric(3,2), dErr datetime);
 Insert Into @testTable (qty, Info, dErr)
 Values ( 1, 1.97, 'Aug 11 2021 9:01AM')
      , ( 1, 1.97, 'Aug 11 2021 9:06AM')
      , (88, 1.33, 'Dec 21 2021 2:04PM')
      , ( 1, 1.95, 'Dec 22 2021 9:44PM')
      , ( 9, 1.95, 'Dec 22 2021 9:45PM')
      , ( 1, 1.33, 'Dec 22 2021 9:51PM')
      , (19, 1.33, 'Dec 22 2021 9:52PM')
      , ( 3, 1.33, 'Dec 22 2021 9:53PM')
      , ( 6, 1.33, 'Dec 27 2021 7:10PM')
      , (17, 1.33, 'Dec 27 2021 7:11PM')
      , (15, 1.95, 'Dec 27 2021 7:17PM')
      , ( 8, 1.95, 'Dec 27 2021 7:18PM')

      , ( 1, 1.97, 'Jan 24 2022 9:39AM')
      , ( 1, 1.97, 'Jan 24 2022 9:51AM')
      , ( 1, 1.97, 'Jan 24 2022 9:58AM')
      , ( 4, 1.97, 'Jan 24 2022 10:08AM')
      , ( 1, 1.97, 'Jan 24 2022 10:12AM')
      , ( 8, 1.95, 'Jan 24 2022 10:24AM')
      , ( 2, 1.95, 'Jan 24 2022 10:32AM')
      , (10, 1.33, 'Jan 24 2022 10:33AM')
      , ( 1, 1.33, 'Jan 24 2022 11:37AM')
      , ( 8, 1.95, 'Jan 24 2022 11:59AM')
      , ( 1, 1.95, 'Jan 24 2022 12:00PM')
      , ( 2, 1.95, 'Jan 24 2022 12:08PM');

 --==== Grouped by date
 Select total_qty = sum(tt.qty)
      , tt.Info
      , latest_date = max(tt.dErr)
   From @testTable tt
  Group By
        tt.Info
      , cast(tt.dErr As date)
  Order By
        cast(tt.dErr As date);

 --==== Grouped by date\hour
 Select total_qty = sum(tt.qty)
      , tt.Info
      , latest_date = max(tt.dErr)
   From @testTable tt
  Group By
        tt.Info
      , cast(tt.dErr As date)
      , datepart(Hour, tt.dErr)
  Order By
        cast(tt.dErr As date)
      , datepart(Hour, tt.dErr);

【讨论】:

  • 数字 1.95, 1.97, 1.33 是 3 个服务器,请求“随机”发送到每个服务器,日期是请求发送到另一台服务器的日期,我在数向每个服务器发出请求,直到它发生变化并具有变化的时间间隔
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-26
  • 1970-01-01
  • 2012-02-21
  • 2018-03-18
相关资源
最近更新 更多