【问题标题】:SQL Query for customer activity in any 24 hrs timframe任何 24 小时时间范围内客户活动的 SQL 查询
【发布时间】:2021-04-11 18:24:48
【问题描述】:

我的数据库中有一个表格总赢额,它显示了客户在特定日期赢取的金额。 例如,

[条目]

![2]

我想获取在 24 小时内赢得超过 200 次的所有客户的列表。 有人可以帮我解决这个问题,不知道如何解决这个问题 例如,在这张图片中,我们有 3 个具有不同帐户 ID 的客户。 如果我们将所有客户的总赢额加起来: 账户 ID 为 1 的客户:为 150(不超过 200) 账户 ID 3 的客户:250(大于 200) 帐户 ID 为 4 的客户:350(大于 200)

我希望帐户 id 3 和 4 作为输出。

【问题讨论】:

  • 请定义“24 小时”的含义。这些是否符合您的门槛?
  • 您好,感谢您的回复,非常感谢。我对粘贴的屏幕截图进行了一些更改。现在,如果我们看一下屏幕截图,就会看到三个不同的客户,他们的账户 ID 是(1,3 和 4)。如果我们将客户的总赢额加起来:账户 ID 为 1 的客户在 24 小时时间范围内的总赢额为 150(不是 200),账户 ID 3 和账户 ID 4 超过 200。所以我想要 Account Id 3 和 Account Id 4 作为输出。我怎么做。非常感谢您的帮助。
  • 。 . “3”在 24 小时内未达到您的阈值。
  • 感谢您指出这一点。我的错,如果时间戳中的第一个条目不是 13(但 16 或更多),那么是的,它会在我的阈值中,但在这种情况下不是。非常感谢您的帮助先生。再次感谢您
  • 您对24 hrs timeframe 的定义是什么?它是滚动的24 hrs 窗口吗?还是相对于特定时间?

标签: sql sql-server-2008


【解决方案1】:

如果您只想要每个日历日:

select accountid, convert(date, datetime), sum(grosswin)
from t
group by accountid, convert(date, datetime)
having sum(grosswin) > 200;

【讨论】:

    【解决方案2】:
    Select * FROM myTable WHERE DateTime > DATEADD(day, -1, getdate()) AND GrossWin > 200
    

    ——-

    附加信息:

    SELECT AccountID, SUM(GrossWin) as TotalWins
    FROM myTable
    WHERE DateTime > DateAdd(day, -1, getdate())
    GROUP BY AccountID
    HAVING SUM(GrossWin) > 200
    

    【讨论】:

    • 您好,感谢您回答我的问题,但我对此有疑问。我使用了以下逻辑: Select * from mytable where datetime> dateadd(day,-1, datetime) 因为我想获得任何 24 小时时间范围内的结果。不会 getdate() 函数只给我最后 24 小时的结果(不确定,非常感谢您的指导)。此外,在我提供的屏幕截图中,条目 3 和 4 也加起来超过 200 个。我也是如何得到的。请你指导我。感谢您的帮助
    • 您是否必须根据其他字段手动汇总 GrossWins?我不明白“加起来超过 200”的请求。没有一列表明哪一列是“客户密钥”。请重新定义您的问题。
    • 对于任何 24 小时时间范围,只需将 getdate() 替换为时间戳“2021-01-05 08:00:00 AM”,请注意时区。
    • 您好,感谢您的回复,非常感谢。我对粘贴的屏幕截图进行了一些更改。现在,如果我们看一下屏幕截图,就会发现三个不同的客户,其帐户 ID 为(1,2 和 3)。如果我们将客户的总赢额加起来:账户 ID 为 1 的客户在 24 小时时间范围内的总赢额为 150(不是 200),账户 ID 3 和账户 ID 4 超过 200。所以我想要 Account Id 3 和 Account Id 4 作为输出。我该怎么做。
    • 知道了。将您的表格粘贴到问题中。在 StackOverflow 上通常不赞成链接到外部屏幕截图。
    【解决方案3】:

    使用NOT EXISTS 检查条件24 hoursSUM(GrossWin) >= 200

    select distinct e.[AccountId]
    from   [Entries] e
    where  exists
           (
               select [AccountId]
               from   Entries x
               where  x.[AccountId] = e.[AccountId]
               and    x.[DateTime] >= dateadd(hour, -24, e.[DateTime])
               and    x.[DateTime] <= e.[DateTime]
               group by [AccountId]
               having sum(x.[GrossWin]) >= 200
           )
    

    CROSS APPLY 查询

    select distinct e.[AccountId]
    from   [Entries] e
           CROSS APPLY
           (
               select GrossWin = sum(x.[GrossWin]) 
               from   Entries x
               where  x.[AccountId] = e.[AccountId]
               and    x.[DateTime] >= dateadd(hour, -24, e.[DateTime])
               and    x.[DateTime] <= e.[DateTime]
               group by [AccountId]
           ) g
    where  g.[GrossWin] >= 200
    

    db<>fiddle

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-06-05
      • 1970-01-01
      • 2023-04-05
      • 2013-07-23
      • 1970-01-01
      相关资源
      最近更新 更多