【问题标题】:Count and grouped by in t-sql在 t-sql 中计数和分组
【发布时间】:2009-03-12 10:50:46
【问题描述】:

我有一个看起来像这样的表

CREATE TABLE MyTable(
    [RecordID] [bigint] IDENTITY(1,1) NOT NULL,
    [PortName] [nvarchar](50) NULL,
    [ReceivedEvent] [datetime] NULL,
    [SentEvent] [datetime] NULL,
);

然后数据可以是

   RecordID | PortName | ReceivedEvent       | SentEvent
   1        | Port1    | 2009-10-20 10:20:00 | NULL
   2        | Port2    | NULL                | 2009-10-20 10:10:00
   3        | Port2    | NULL                | 2009-10-20 10:02:00
   4        | Port2    | NULL                | 2009-10-20 11:00:00

我现在需要对这张表提出两个问题:

1) 我需要计算按端口和日期(而不是时间)分组的行数。然而,日期是问题中的一个参数(在这种情况下,它可能是“2009-10-20”)。我还想要每个小时的最后一个“活动”

   NumberOfRows | PortName | Hour | LastActivityInHour 
   2            | Port2    | 10   | 2009-10-20 10:10:00
   1            | Port2    | 11   | 2009-10-20 11:00:00
   1            | Port1    | 10   | 2009-10-20 10:20:00

2) 我还需要一个问题做同样的事情,但按天分组。正如我所说的,day 是一个传入参数。在这种情况下,它可能是“2009-10-20”

   NumberOfRows | PortName | LastActivityInDay 
   3            | Port2    | 2009-10-20 11:00:00
   1            | Port1    | 2009-10-20 10:20:00

【问题讨论】:

  • 请注意,我对 SQL 进行了相当大的更改。您可能希望使用新代码而不是调整后的版本。 ;)

标签: sql-server tsql


【解决方案1】:

由于您的数据模型没有正确规范化,这比它需要的更难看。

SELECT
  COUNT(t.RecordID) NumberOfRows,
  t.PortName,
  t.EventHour,
  MAX(t.EventDateTime) LastActivityInHour
FROM
  (
    SELECT
      RecordID,
      PortName,
      COALESCE(ReceivedEvent, SentEvent) EventDateTime,
      DATEPART(hh, COALESCE(ReceivedEvent, SentEvent)) EventHour,
      DATEADD(dd, 0, DATEDIFF(dd, 0, COALESCE(ReceivedEvent, SentEvent))) EventDate
    FROM
      MyTable
  ) t
WHERE
  t.EventDate = DATEADD(dd, 0, DATEDIFF(dd, 0, @TheDateInQuestion))
GROUP BY
  t.PortName,
  t.EventHour
ORDER BY
  t.PortName,
  t.EventHour

执行按日期分组的 SQL 非常相似,我将把它作为练习留给你。 ;-)

我确信还有其他方法可以获得相同的结果。在这里查看内部查询将有助于清理整个查询。

【讨论】:

  • OK ...但是我几乎无法让它显示当前日期内的最后一个活动...它显示所有天内的最后一个活动
猜你喜欢
  • 1970-01-01
  • 2016-01-05
  • 2016-06-16
  • 1970-01-01
  • 2018-07-03
  • 2012-05-08
  • 2013-07-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多