0

この問題を解決するのは難しいと思います。DDBB に次のようなテーブルがあります。

+----+--------+-------+
| 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} は [20.00->21.00、7.00->8.00] の 2 倍に増加しています。

最後に、次の出力が必要です。

+----+------------+
| ID | NUM_OF_INC |
+----+------------+
| 1  | 2          |
+----+------------+

私が主な問題として指摘しているのは、{MONTH} が DATE タイプのフィールドではないということです (もちろん、そうではありません)。

これを達成する方法はありますか?残念ながら、解決策はすべての値を取得し、クエリを実行しているエンジンから 1 つずつ比較することです。

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 に答える