我认为这个问题很难解决。 我的DDBB中有一个TABLE就像这个:
+----+--------+-------+
| ID | MONTH | VALUE |
+----+--------+-------+
| 1 | 1-2000 | 20.00 |
| 1 | 2-2000 | 21.00 |
| 1 | 3-2000 | 7.00 |
| 1 | 4-2000 | 8.00 |
+----+--------+-------+
具有以下定义:
ID INTEGER(7) ZEROFILL NOT NULL
MONTH VARCHAR(7) NOT NULL
VALUE DOUBLE(20,2)
我想要实现的是通过一段时间检索字段{VALUE}从之前的值增加的次数的方法。 在上面的示例中,如果期间从“1-2000”到“4-2000”,则{VALUE}增加了2倍:[20.00-> 21.00,7.00> 8.00]
最后,我想得到以下结果:
+----+------------+
| ID | NUM_OF_INC |
+----+------------+
| 1 | 2 |
+----+------------+
我指出的主要问题是{MONTH}不是DATE类型字段(当然,它不是)。
有没有办法实现这个目标? 我担心解决方案是获取所有值,然后从执行查询的引擎逐个进行比较。
答案 0 :(得分:0)
由于您的日期格式和MySQL缺少CTE一次转换它们,查询变得非常冗长;这会搜索整个范围,但使用相同的模式添加范围检查相当容易;
SELECT a.id, COUNT(*) NUM_OF_INC
FROM Table1 a
JOIN Table1 b
ON a.id = b.id
AND a.value < b.value
AND STR_TO_DATE(CONCAT(a.`MONTH`, '-1'), '%c-%Y-%d')
< STR_TO_DATE(CONCAT(b.`MONTH`, '-1'), '%c-%Y-%d')
LEFT JOIN Table1 c
ON a.id = c.id
AND STR_TO_DATE(CONCAT(a.`MONTH`, '-1'), '%c-%Y-%d')
< STR_TO_DATE(CONCAT(c.`MONTH`, '-1'), '%c-%Y-%d')
AND STR_TO_DATE(CONCAT(c.`MONTH`, '-1'), '%c-%Y-%d')
< STR_TO_DATE(CONCAT(b.`MONTH`, '-1'), '%c-%Y-%d')
WHERE c.id IS NULL
GROUP BY a.id;
可悲的是,此查询肯定不会使用MONTH
上的任何索引。
答案 1 :(得分:0)
如果是一个选项,可以考虑将MONTH的数据类型更改为可计算的值。然后你可以加入上个月(月 - 1)并选择差异&gt; 0:
SELECT
t1.ID, count(*)
FROM
Entity t1
INNER JOIN Entity t2
ON t1.ID = t2.ID
AND t2.MONTH = t1.MONTH - 1
WHERE
t1.VALUE - t2.VALUE > 0
AND t1.MONTH BETWEEN :beginDate AND :endDate
GROUP BY t1.ID
如果无法更改数据类型。您必须使用一些MySQL函数更改t1.MONTH - 1
:
DATE_FORMAT(
SUBDATE(
STR_TO_DATE(CONCAT(t1.MONTH, "-1"), "%c-%Y-%d"),
INTERVAL 1 MONTH),
"%c-%Y")
以及t1.MONTH BETWEEN :beginDate AND :endDate
:
STR_TO_DATE(CONCAT(t1.MONTH, "-1"), "%c-%Y-%d")
BETWEEN :beginDate AND :endDate