【问题标题】:SQL simple datetime count occurences query driving me crazy!SQL 简单的日期时间计数出现查询让我抓狂!
【发布时间】:2010-12-06 22:35:35
【问题描述】:

感谢任何可以提供帮助的人。我正在使用 MSSQL 2005

我有一个这样的数据库

SegmentDT DateTime,
WhoCalled varchar(4)

我想要做的就是找到所有在 5 分钟内有通话次数的 WhoCalled。

我怎样才能做到这一点?

【问题讨论】:

  • 你能添加一个输出示例吗?如果您有 3 行,所有行的 whocall = 'beth' 和 segmentDT 值 1/1/2010 12:00、1/1/2010 12:01、1/1/2010 12:02,您期望返回什么结果?

标签: sql sql-server-2005 datetime count


【解决方案1】:
  • 您可能不需要 ABS
  • 5 分钟的 DATEDIFF 涵盖 4 分 0.003 秒到 5 分 59.997 秒的范围,因为边界是如何完成的(零秒)
  • COUNT(DISTINCT SegmentDT) 应该消除在 300 秒窗口内有多个调用的情况

所以:

SELECT
     WhoCalled, COUNT(DISTINCT SegmentDT)
FROM
     MyTable a
     INNER JOIN
     MyTable b ON a.WhoCalled = b.WhoCalled
WHERE
     ABS(DateDiff(second, a.SegmentDT, b.SegmentDT)) <= 300

另一个公式是使用窗口函数。这将比较相邻的行:

;WITH CTE AS
(
    SELECT
        WhoCalled, 
        ROW_NUMBER() OVER (ORDER BY SegmentDT) AS RowNum
    FROM
        MyTable
)
SELECT
     WhoCalled, COUNT(*)
FROM
     CTE a
     INNER JOIN
     CTE b ON a.WhoCalled = b.WhoCalled AND a.RowNum + 1 = b.RowNum
WHERE
     DateDiff(second, a.SegmentDT, b.SegmentDT) <= 300

【讨论】:

    【解决方案2】:
    SELECT WhoCalled, count(*)
    FROM tbl a
    INNER JOIN tbl b ON a.WhoCalled = b.WhoCalled
    AND DateDiff(n, a.SegmentDT, b.SegmentDT) > 0
    AND DateDiff(n, a.SegmentDT, b.SegmentDT) <= 5
    

    【讨论】:

      猜你喜欢
      • 2011-05-20
      • 1970-01-01
      • 1970-01-01
      • 2011-07-05
      • 1970-01-01
      • 1970-01-01
      • 2010-11-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多