Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 根据其他行的值调整最小值(日期)_Mysql_Sql - Fatal编程技术网

Mysql 根据其他行的值调整最小值(日期)

Mysql 根据其他行的值调整最小值(日期),mysql,sql,Mysql,Sql,表: 我正在寻找一个查询,该查询返回每个用户ID的“差异”(>0)之和,该用户ID的最小日期为'16/7/2019',带有exeption,如果该用户ID在上下文行中有重置,则必须忽略小于重置记录位置的最小日期 因此,输出应该如下所示: +----+--------+------------+------+---------+-----------------+ | id | userID | difference | type | context | time | +--

表:

我正在寻找一个查询,该查询返回每个用户ID的“差异”(>0)之和,该用户ID的最小日期为'16/7/2019',带有exeption,如果该用户ID在上下文行中有重置,则必须忽略小于重置记录位置的最小日期

因此,输出应该如下所示:

+----+--------+------------+------+---------+-----------------+
| id | userID | difference | type | context |      time       |
+----+--------+------------+------+---------+-----------------+
| 83 |    111 |         30 |      |         | 7/15/2019 15:23 |
| 84 |    111 |         10 |      |         | 7/16/2019 15:28 |
| 85 |    111 |        -10 |      | Reset   | 7/16/2020 15:28 |
| 86 |    222 |         50 |      |         | 7/8/2020 15:28  |
| 87 |    222 |        -10 |      | Reset   | 7/8/2020 15:28  |
| 88 |    333 |        -10 |      | Reset   | 5/11/2020 13:15 |
| 89 |    333 |         10 |      |         | 7/16/2019 13:16 |
| 91 |    111 |         20 |      |         | 7/17/2019 23:15 |
+----+--------+------------+------+---------+-----------------+
我的尝试:

+--------+-------------+
| userID | SUM(points) |
+--------+-------------+
|    111 |          30|
+--------+-------------+
下面是选项卡的创建步骤:

SELECT userID, SUM(case when difference > 0 then difference else 0 end),    
FROM test WHERE (CASE 
WHEN (Select MAX(CAST(time as DATE)) where context ='Reset') > (Select 
MIN(CAST(time as DATE))) THEN (Select MAX(CAST(time as DATE)) where 
context ='Reset') ELSE (Select MIN(CAST(time as DATE))) END) = '7/16/2019' group by userID

试试这样的。对于每个用户,找到重置日期并按旧记录筛选

CREATE TABLE `test` (
  `id` int(11) NOT NULL,
  `userID` int(11) NOT NULL,
  `difference` int(11) NOT NULL,
  `type` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
  `context` text COLLATE utf8_unicode_ci NOT NULL,
  `time` datetime NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

INSERT INTO `test` (`id`, `userID`, `difference`, `type`, `context`, `time`)    VALUES
(83, 111, 30, '', '', '2019-07-15 15:23:22'),
(84, 111, 10, '', '', '2019-07-16 15:28:27'),
(85, 111, -10, '', 'Reset', '2020-07-16 15:28:27'),
(86, 222, 50, '', '', '2020-07-08 15:28:27'),
(87, 222, -10, '', 'Reset', '2020-07-08 15:28:27'),
(88, 333, -10, '', 'Reset', '2020-05-11 13:15:05'),
(89, 333, -10, '', '', '2019-07-16 13:16:35'),
(91, 111, 20, '', '', '2019-07-17 23:15:57');

如前所述,在对一个几乎相同的问题()的评论中,请看我使用的是Mysql。如果是这样,在示例数据和问题文本中使用MySQL的日期格式。但最好的方法是用CREATE table+INSERT INTO脚本替换表格格式中的样本数据。样本数据是否代表您的数据?这意味着一旦重置userid,就永远无法获得更多的点数..我更新了表格,添加了我尝试过的查询和表格的Create语句。我读了几遍,仍然不知道如何从示例数据中获得所需的结果。我怀疑一个用户ID可能会有许多重置,OP不想硬编码。我更正了一个用户ID可能会有多个重置,并且最小日期应该调整。我的问题似乎很糟糕,所以我将对其进行编辑。多次重置有什么问题?您只需要每个用户的最晚重置日期。这是在使用
MAX
函数查询
resetDates
时完成的。如果未进行重置,则将使用默认值。这是通过
WHERE
条件和
IFNULL
实现的。
SELECT 
    t1.userId, SUM(points)
FROM 
    table1 t1
LEFT JOIN (
    SELECT t2.userId, max(t2.date) date
    FROM table2 t2 
    WHERE context = "Reset"
    GROUP BY t2.userId
) resetDates on resetDates.userId = t1.userId
WHERE 
    t1.date >= IFNULL(resetDates.date, "01-01-2020")
GROUP BY 
    t1.userId;