MySQL中通过句点的增量数

时间:2013-08-08 12:04:35

标签: mysql sql

我认为这个问题很难解决。 我的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类型字段(当然,它不是)。

有没有办法实现这个目标? 我担心解决方案是获取所有值,然后从执行查询的引擎逐个进行比较。

2 个答案:

答案 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;

An SQLfiddle to test with

可悲的是,此查询肯定不会使用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