【问题标题】:SQL/Entity Framework Group data by hourSQL/Entity Framework 按小时分组数据
【发布时间】:2013-06-18 14:32:11
【问题描述】:

我有一个包含以下信息的表,这是一个更大的数据集(大约 100k 行)的一个小子集每行都是一个传入请求,我想要做的是获取正确的查询以允许我显示折线图中的数据作为每小时的请求总量,使用开始时间。并非所有小时都存在于数据集中,但仍需要表示为 0。最终目标是显示在谷歌可视化折线图上。

    ID  Duration    Store   Start                   End                     MacID   
    7   31          1       2013-06-08 07:46:10.000 2013-06-08 08:17:00.000 8532
    4   2           1       2013-06-08 18:42:53.000 2013-06-08 18:44:06.000 8530
    2   1           1       2013-06-08 14:31:20.000 2013-06-08 14:32:08.000 8529    
    11  213         1       2013-06-08 12:43:55.000 2013-06-08 16:16:11.000 8534
    6   585         1       2013-06-08 14:03:58.000 2013-06-08 23:48:44.000 8531
    28  287         1       2013-06-08 07:15:40.000 2013-06-08 12:02:10.000 8542

最终的格式需要是

   ['Hour', 'Total'],
     ['00', 1000 ],
     ['01', 1170 ],
     ['02', 0],
     ['03', 1030]

我正在使用 sql 2012 和实体框架。我尝试了以下查询

SELECT CAST(start as date) AS ForDate,
       DATEPART(hour,start) AS OnHour,
       COUNT(*) AS Totals
from (
SELECT * from visits
GROUP BY CAST(start as date),
       DATEPART(hour,start)

但是,它只带回有数据小时的结果。获取数据的最佳方式是什么? SQL 或实体框架,我将如何处理?

【问题讨论】:

  • 类似问题:stackoverflow.com/q/17086120/861716。最好的选择是填补内存中的空白时间。
  • 是的,有道理,但是首先对数据进行分组的查询呢,保持原样?还是使用 EF 会更好?
  • 可能与 EF 一起使用,因此您可以更灵活地从 C# 源代码中对其进行修改。

标签: sql sql-server entity-framework


【解决方案1】:

你可以试试这个,

visits.Where(u=> u.Start != null).GroupBy(u => u.Start.GetValueOrDefault().Hour).Select(g => new { OnHour = g.Key, Totals = g.Count() })

和Sql查询;

SELECT COUNT(*) AS [Totals], [t1].[value] AS [OnHour]
FROM (
    SELECT DATEPART(Day, COALESCE([t0].[LASTCONNECTIONTIME],'1.1.0001 00:00:00')) AS [value], [t0].[Start]
    FROM [visits] AS [t0]
    ) AS [t1]
WHERE [t1].[Start] IS NOT NULL
GROUP BY [t1].[value]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-03-08
    • 2017-07-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多