【问题标题】:Progressive count using a query?使用查询进行累进计数?
【发布时间】:2010-07-02 17:14:59
【问题描述】:

我用这个查询来

SELECT userId, submDate, COUNT(submId) AS nSubms
FROM submissions
GROUP BY userId, submDate
ORDER BY userId, submDate

获取每个用户每个日期的提交总数。
但是,我需要为每个用户提供渐进计数,这样我才能看到他们的提交是如何随着时间的推移而累积的。

这可以在查询中实现吗?

编辑:获得的表格如下所示:

  userId submDate nSubms
  1       2-Feb    1
  1       4-Feb    7
  2       1-Jan    4
  2       2-Jan    2
  2       18-Jan   1

我想制作这个:

  userId submDate nSubms  progressive
  1       2-Feb    1           1
  1       4-Feb    7           8
  2       1-Jan    4           4
  2       2-Jan    2           6
  2       18-Jan   1           7

编辑2:抱歉之前没有提到,我不允许使用:

  • 存储过程调用

  • 更新/删除/插入/创建查询

  • 工会

  • DISTINCT 关键字

    因为我使用的工具不允许这些。

【问题讨论】:

标签: sql mysql stored-procedures count


【解决方案1】:

您可以使用自连接来抓取同一个表中日期在当前行之前的所有行:

SELECT s0.userId, s0.submDate, COUNT(s0.submId) AS nSubms, COUNT (s1.submId) AS progressive
FROM submissions AS s0
JOIN submissions AS s1 ON s1.userId=s0.userId AND s1.submDate<=s0.submDate
GROUP BY s0.userId, s0.submDate
ORDER BY s0.userId, s0.submDate

这将迫使数据库做大量无意义的工作,一次又一次地计算所有相同的行。最好在调用查询的任何脚本或 SQL 变量中添加 nSubms(如果在您的环境中可用)。

【讨论】:

  • 恐怕代码不能按预期工作......不过我猜一般概念是正确的。
  • 这也会导致绝对可怕的性能问题。不要这样。
【解决方案2】:

最好的解决方案是在客户端进行。
这是工作的正确工具。数据库不适合这种任务

【讨论】:

  • 嗯,一些数据库支持窗口/分析函数来非常简单地做到这一点。但不是 SQL Server。
  • 真的。但 IMO 这仍然是客户端的责任。这就是它的用途。
【解决方案3】:
Select S.userId, S.submDate, Count(*) As nSubms
    , (Select Count(*)
        From submissions As S1
        Where S1.userid = S.userId
            And S1.submDate <= S.submDate) As TotalSubms
From submissions As S
Group By S.userid, S.submDate
Order By S.userid, S.submDate

【讨论】:

  • @Wartin - 我已经更正了我的查询并在我的系统上进行了测试。现在应该可以正常工作了。
  • Thomas,没有“S.nSubms”这样的字段。 “nSubms”是我使用的查询中的计算字段。
  • @Wartin - 简单修复。只需将 Sum 替换为 Count(*)。我已经调整了我的查询以适应。在我的测试中,这产生了正确的输出。这确实依赖于 submDate 是一个日期时间列这一事实。
  • 这是一个很好的解决方案!!我将此查询改编为另一个示例,并且可以为每个重复字段创建一个带有累进数字的计数器!哇,恭喜!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-24
  • 2013-07-24
  • 1970-01-01
  • 2014-01-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多