【问题标题】:SQL Find Count of Records by Day and By UserSQL 按天和按用户查找记录数
【发布时间】:2013-08-21 20:49:13
【问题描述】:

我正在尝试查找他们在记录表中拥有超过 100 条记录的人列出的天数。拥有子句有问题,但我不确定如何按人区分计数。 where 子句也有问题,我也尝试输入“where Count(Recordings.ID) > 100”,但也没有用。这是我目前所拥有的:

SELECT Person.FirstName,
       Person.LastName,
       Count(Recordings.ID) AS DAYS_ABOVE_100
FROM   Recordings
JOIN   Person ON Recordings.PersonID=Person.ID
WHERE  DAYS_ABOVE_100 > 100
AND    Created BETWEEN '2013-08-01 00:00:00.000' AND '2013-08-21 00:00:00.000'
GROUP  BY Person.FirstName,
       Person.LastName
HAVING Count(DISTINCT PersonID), Count(Distinct Datepart(day, created))
ORDER  BY DAYS_ABOVE_100 DESC

我想得到的示例数据:

First  Last    Days_Above_100
John   Doe     5
Jim    Smith   12

这意味着在给定时间范围内的 5 天内,John Doe 每天有超过 100 条记录。

【问题讨论】:

    标签: sql count where-clause having-clause datepart


    【解决方案1】:

    为了可读性,我将问题分成两部分。

    首先,计算每个人一天有多少录音。这是公用表表达式中的查询(第一个 select 语句)。然后针对公用表表达式进行选择,将行限制为您需要的行。

    with cteRecordingsByDate as
    (
      SELECT Person.FirstName,
            Person.LastName,
            cast(created as date) as Whole_date,
            Count(Recordings.ID) AS Recording_COUNT
      FROM   Recordings
      JOIN   Person ON Recordings.PersonID=Person.ID
      WHERE  Created BETWEEN '2013-08-01 00:00:00.000' AND '2013-08-21 00:00:00.000'
      GROUP  BY  Person.FirstName, Person.LastName, cast(created as date)
    )
    
    select FirstName, LastName, count(*) as Days_Above_100
    from cteRecordingsByDate
    where Recording_COUNT > 100
    order by count(*) desc
    

    【讨论】:

    • 我只需要在倒数第二行添加“Group By FirstName, LastName”就可以了!感谢您的帮助!
    【解决方案2】:

    您可以使用子查询来计算您想要的内容。内部查询计算每天的记录数。外部子查询然后计算超过 100 天的天数(并添加人员信息):

    SELECT p.FirstName, p.LastName,
           count(*) as DaysOver100
    FROM (select PersonId, cast(Created as Date) as thedate, count(*) as NumRecordings
          from Recordings r
          where Created BETWEEN '2013-08-01 00:00:00.000' AND '2013-08-21 00:00:00.000'
         ) r join
         Person p
         ON r.PersonID = p.ID
    WHERE r.NumRecordings > 100
    GROUP BY p.FirstName, p.LastName;
    

    这使用 SQL Server 语法将 datetime 转换为 date。在其他数据库中,您可以使用trunc(created)date(created) 从日期时间中提取日期。

    【讨论】:

    • 我相信他需要 HAVING 子句来隔离人们在 Recordings 表中拥有超过 100 个条目的日子。
    • @GoatCO 。 . .点击。我得到了它。文本中的描述和查询似乎没有描述相同的数据结构。我完全修改了答案。
    【解决方案3】:

    我想这就是你所追求的:

    SELECT p.FirstName,
           p.LastName,
           COUNT(*) AS DAYS_ABOVE_100
    FROM   (SELECT PersonID, Created, COUNT(*)
            FROM Recordings
            GROUP BY ID,Created
            HAVING COUNT(*) > 100
            )r
    JOIN   Person p
      ON r.PersonID = p.ID
    WHERE  Created BETWEEN '2013-08-01 00:00:00.000' AND '2013-08-21 00:00:00.000'
    GROUP  BY p.FirstName,
              p.LastName
    ORDER  BY DAYS_ABOVE_100 DESC
    

    【讨论】:

      【解决方案4】:

      你应该试试这个:

       SELECT SUBQUERY.FirstName,
              SUBQUERY.LastName,
              Count(*) AS DAYS_ABOVE_100
       FROM
       (
           SELECT Person.FirstName,
                  Person.LastName,
                  Count(Recordings.ID) AS COUNT_RECORDINGS
           FROM   Recordings
           JOIN   Person ON Recordings.PersonID=Person.ID
           WHERE  Created BETWEEN '2013-08-01 00:00:00.000' AND 
                                  '2013-08-21 00:00:00.000'
           GROUP  BY Person.FirstName,
                     Person.LastName,
                     Created 
           HAVING Count(Recordings.ID) > 100
       )SUBQUERY
       GROUP  BY SUBQUERY.FirstName,
                 SUBQUERY.LastName
       ORDER  BY Count(*) DESC
      

      认为 Have 子句的工作方式类似于 Where 子句,但它接受聚合,例如 sum (source)。您的查询有一些错误,即:

      • WHERE 子句中的聚合,但 Where 子句不接受聚合。
      • 您在 ORDER BY 子句中通过别名“DAYS_ABOVE_100”引用聚合“Count(Recordings.ID)”。您不能在定义该别名的同一选择中通过其别名访问列。列只能通过查询外部的别名访问,就像在查尔斯的回答中一样。

      编辑:

      抱歉,我没有注意到“按天”部分,编辑了查询。将 created 列添加到 GROUP BY 子句以获取每天的总记录数,然后将其包装在另一个查询中以计算结果,再次按 FirstName 和 Lastname 分组。

      【讨论】:

      • 这只是给我每个人在整个时间范围内的总记录
      猜你喜欢
      • 2023-03-17
      • 2018-03-02
      • 1970-01-01
      • 2020-05-12
      • 2019-07-18
      • 2021-07-01
      • 2018-07-27
      • 2013-07-08
      • 1970-01-01
      相关资源
      最近更新 更多