我在一个SQL表中有以下数据.看SQL fiddle就可以玩了.

id pointsEarned createdAt
234-00000206-0 500 2023-05-03T09:05:05.034Z
234-00000206-0 1000 2023-05-12T09:05:05.034Z
234-00000206-0 800 2023-05-15T09:05:05.034Z
234-00000206-0 300 2023-05-21T09:05:05.034Z
234-00000206-0 1100 2023-05-28T09:05:05.034Z

数据按如下方式创建.

CREATE TABLE activities (
  id varchar(14),
  pointsEarned int,
  createdAt varchar(24)
  );
  
INSERT INTO activities (id, pointsEarned, createdAt)
VALUES ('234-00000206-0', 500, '2023-05-03T09:05:05.034Z');

INSERT INTO activities (id, pointsEarned, createdAt)
VALUES ('234-00000206-0', 1000, '2023-05-12T09:05:05.034Z');

INSERT INTO activities (id, pointsEarned, createdAt)
VALUES ('234-00000206-0', 800, '2023-05-15T09:05:05.034Z');

INSERT INTO activities (id, pointsEarned, createdAt)
VALUES ('234-00000206-0', 300, '2023-05-21T09:05:05.034Z');

INSERT INTO activities (id, pointsEarned, createdAt)
VALUES ('234-00000206-0', 1100, '2023-05-28T09:05:05.034Z');

从这些数据中,我正在寻找那些已经超过1.000分的ID,以及发生的日期.在样本数据中,这应该已经是5月12日在第二行.

我try 了这条SQL语句,但这里的结果当然是5月28日.

SELECT 
  id, 
  SUM(pointsEarned) as points, 
  MAX(createdAt) as lastActivity
FROM 
  activities
GROUP BY
  id
HAVING 
  points > 1000;

然后我在考虑使用窗口函数,并try 了这个,但得到了一个错误,表明该语句是错误的.你知道如何修复错误(参见上面的SQL fiddle链接),以及如何将查询限制在1.000点以内吗?

SELECT 
  id,
  SUM(pointsEarned) OVER(ORDER BY createdAt) points
FROM activities;

PS:SQL小提琴使用MySQL.最后,我需要Google BigQuery的声明.

推荐答案

您的代码不能在MySQL 5.6中运行,因为在该版本的MySQL中,窗口函数还不可用.此外,如果您需要Google BigQuery解决方案,您不应该在MySQL上进行测试,因为它们是使用不同工具的两个截然不同的产品.

考虑到这些前提,在Google BigQuery中您可以使用QUALIFY子句,它允许您过滤窗口函数的结果.您可以使用QUALIFY两次判断:

  • 当点数的游程总和大于1000时
  • 当该日期对应于您筛选的运行和的第一个日期时

按"id"进行分区(假设您可以有多个ID),并按日期排序.

WITH cte AS (
    SELECT id, 
           SUM(pointsEarned) OVER(PARTITION BY id ORDER BY createdAt) AS runningPoints, 
           createdAt
    FROM activities
    QUALIFY runningPoints > 1000
)
SELECT id, runningPoints, createdAt 
FROM cte 
QUALIFY createdAt = MIN(createdAt) OVER(PARTITION BY id ORDER BY runningPoints)

这个答案在BigQuery上进行了测试,并给出了以下输出:

id runningPoints createdAt
234-00000206-0 1500 2023-05-12T09:05:05.034Z

Sql相关问答推荐

如何根据SQL中的列条件获取下一个时间戳?

SQL计数所有值在联接范围内的行

用相同值更新行

Postgres JSONB对象筛选

Oracle SQL-将结果列在单行中

SQL:如何取上一年的平均值?

直接加法(1+1)与聚合函数SUM(1+1)的区别是什么

snowflake/SQL嵌套的JSON对象和数组

Select 非重复值并按条件排除行

按分类标准检索记录

数组列的postgres更新查询

在Postgres中合并相似的表

多条件SQL排序行为

将JSON文件导入Postgres 16数据库时出错(22P04上次预期列之后的额外数据)

优化Postgres搜索未知长度的子串

更正用于判断错误组合的SQL

如何在T-SQL中编写row_number的WHERE子句?

Postgres更新增量之间的差异

REGEXP_SUBSTR使用方法

在 MySql 数据库中的两个日期之间搜索