【问题标题】:Filter SQL GROUP by a filter that is not in GROUP通过不在 GROUP 中的过滤器过滤 SQL GROUP
【发布时间】:2021-01-11 13:16:04
【问题描述】:

我正在开发一个流服务,比如基于 C# NET.Core 的应用程序。我每分钟从客户端“ping”服务器,然后使用此查看器的时间和 ID 创建一个新的 SQL 条目。

以下是 5 分钟观看的示例:

StreamViewerId | TrackDate
             1 | 2020-09-25 05:05:00
             1 | 2020-09-25 05:06:00
             1 | 2020-09-25 05:07:00
             1 | 2020-09-25 05:08:00
             1 | 2020-09-25 05:09:00
             1 | 2020-09-25 05:10:00
             ...

我需要根据该数据制作一个“图表条”,我无法将 1 分钟的图形作为 xAxis,因此我尝试使每个图形点至少 5 分钟或更长时间。问题是,如果我只使用下面的查询,所有的观众都被乘以 x5,因为他们每分钟 ping 服务器,所以一个组中会有 5 行:

SELECT 
   COUNT(LiveStreamViewerId) [Count], 
   dateadd(minute,(datediff(minute,0,TrackDate)/5)*5,0) [TrackDate] 
   FROM LiveStreamViewerTracks 
   WHERE LiveStreamId = 1
GROUP BY dateadd(minute,(datediff(minute,0,TrackDate)/5)*5,0)

我实际上得到了这个结果:

Count | TrackDate
    5 | 2020-09-25 05:05:00
    ...

我想将此查看器视为只有一个寄存器(因为只有一个查看器,而不是 5 个)。以下是预期结果:

Count | TrackDate
    1 | 2020-09-25 05:05:00

我不能使用两个 SQL 分区,因为我不能按 viewerid 分组,因为我已经按日期时间分组,所以我不能过滤它。有人可以帮忙吗?

提前致谢!

【问题讨论】:

  • 向我们展示一些示例表数据和预期结果 - 全部为格式化文本(无图像)。minimal reproducible example
  • @jarlh 已编辑,谢谢!
  • 您不希望 2020-09-25 05:10:00 也返回吗?我认为该时间戳是一个新的 5 分钟周期。
  • @jarlh 如果我这样做,我会考虑 2020-09-25 05:05:00 那么,对吧?因为这个逻辑会将这个时间戳转为上一组,在范围内产生相同的数字,对吧?
  • 所以下一个时段是 05:10:01 - 05:15:01,然后是 05:15:02 - 05:20:02 和 05:20:03 - 05:25: 03等?

标签: c# sql sql-server .net-core


【解决方案1】:

您可以使用 COUNT(DISTINCT LiveStreamViewerID) 来代替 COUNT(LiveStreamViewerID),它会删除重复项。

【讨论】:

  • 天啊!我不敢相信这是可能的。非常感谢!
  • 谢谢!但请试一试,以确保它完成您希望它做的事情。
  • 我检查过了,它确实满足了我的需求。我还在你回答之前编辑了我的问题,这正是我所需要的。谢谢!
  • OP = 提问者。
  • @jarlh 你就像一个 Stack Oraculum,刚刚学会了 OP = Original Poster。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多