0

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

有什么办法可以做到这一点?恐怕解决方案是获取所有值,然后从执行查询的引擎中一一比较。

4

2 回答 2

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;

一个用于测试的 SQLfiddle

遗憾的是,此查询绝对不会使用您在MONTH.

于 2013-08-08T12:38:26.047 回答
0

如果这是一个选项,请考虑将 MONTH 的数据类型更改为可计算的值。然后您可以加入上个月(Month - 1)并选择差异> 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

如果您无法更改数据类型。您必须t1.MONTH - 1使用一些 MySQL 函数来更改:

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
于 2014-01-12T06:04:31.523 回答