0

次のクエリで得られる結果が多すぎる理由について、頭がぐるぐるしています。

次の 2 つの表に基づいています。

P4クエリ:

+------------+----+-----------------+--------+----------+
| Date       | Id | MeteringPointId | Reason | StatusId |
+------------+----+-----------------+--------+----------+
| 2013-08-29 | 60 |               2 | DAY    |       60 |
| 2013-08-29 | 59 |               2 | INT    |       59 |
| 2013-08-29 | 50 |               3 | DAY    |       50 |
| 2013-08-28 | 58 |               3 | DAY    |       58 |
| 2013-08-28 | 57 |               3 | INT    |       57 |
| 2013-08-28 | 56 |               2 | DAY    |       56 |
| 2013-08-28 | 55 |               2 | INT    |       55 |

そして P4Reading:

+-------------+------+---------+----------+---------------------+------+-------------+
| EnergyMeter | Id   | QueryId | Register | Time                | Unit | Value       |
+-------------+------+---------+----------+---------------------+------+-------------+
| 15524067    | 2406 |      59 | 2.8.0    | 2013-08-29 23:30:00 | WH   |       0.000 |
| 15524067    | 2609 |      59 | 1.8.0    | 2013-08-29 23:30:00 | WH   | 5959289.000 |
| 15524067    | 2243 |      59 | 2.8.0    | 2013-08-29 23:15:00 | WH   |       0.000 |
| 15524067    | 2448 |      59 | 1.8.0    | 2013-08-29 23:15:00 | WH   | 5959179.000 |

P4Reading テーブル (同じテーブル) で JOIN を作成した次のクエリを使用して、過去 15 分間の値を取得します。これはうまく機能しますが、多くの値が得られます。join または where ステートメントが不足しているように見えますが、それを取得できません。どこから問題が発生しているのかわかりません。

SELECT `P4Query`.`MeteringPointId`, `table1`.`EnergyMeter`, `table1`.`Register`,
       `table1`.`Time`, `table1`.`Unit`, `table1`.`Value`,
      (`table2`.`Value` - `table1`.`Value`)/1000 as totaal
FROM P4Query, P4Reading table1
INNER JOIN P4Reading table2 ON `table1`.`Time` = (`table2`.`Time` - INTERVAL 15 minute)
WHERE (`P4Query`.`Id` = `table1`.`QueryId`)
ORDER BY `table1`.`Time` DESC;

私は次のことを期待します:

+-----------------+-------------+----------+---------------------+------+-------------+---------------+
| MeteringPointId | EnergyMeter | Register | Time                | Unit | Value       | totaal        |
+-----------------+-------------+----------+---------------------+------+-------------+---------------+
|               2 | 15524067    | 1.8.0    | 2013-08-29 23:30:00 | WH   | 5959289.000 |     0.1380000 |
|               2 | 15524067    | 2.8.0    | 2013-08-29 23:30:00 | WH   |       0.000 |     0.0000000 |
|               2 | 15524067    | 1.8.0    | 2013-08-29 23:15:00 | WH   | 5959179.000 |     0.1100000 |
|               2 | 15524067    | 2.8.0    | 2013-08-29 23:15:00 | WH   |       0.000 |     0.0000000 |

しかし、私は得る:

+-----------------+-------------+----------+---------------------+------+-------------+---------------+
| MeteringPointId | EnergyMeter | Register | Time                | Unit | Value       | totaal        |
+-----------------+-------------+----------+---------------------+------+-------------+---------------+
|               2 | 15524067    | 2.8.0    | 2013-08-29 23:30:00 | WH   |       0.000 |  5959.4270000 |
|               2 | 15524067    | 1.8.0    | 2013-08-29 23:30:00 | WH   | 5959289.000 | -5959.2890000 |
|               2 | 15524067    | 1.8.0    | 2013-08-29 23:30:00 | WH   | 5959289.000 |     0.1380000 |
|               2 | 15524067    | 2.8.0    | 2013-08-29 23:30:00 | WH   |       0.000 |     0.0000000 |
|               2 | 15524067    | 1.8.0    | 2013-08-29 23:15:00 | WH   | 5959179.000 |     0.1100000 |
|               2 | 15524067    | 2.8.0    | 2013-08-29 23:15:00 | WH   |       0.000 |  5959.2890000 |
|               2 | 15524067    | 1.8.0    | 2013-08-29 23:15:00 | WH   | 5959179.000 | -5959.1790000 |
|               2 | 15524067    | 2.8.0    | 2013-08-29 23:15:00 | WH   |       0.000 |     0.0000000 |

フィドルの準備ができました: http://sqlfiddle.com/#!2/c2bdf/1

4

3 に答える 3

1

読みやすいように、テーブル エイリアスを使用したクエリを次に示します。

SELECT pq.`MeteringPointId`, pr1.`EnergyMeter`, pr1.`Register`, pr1.`Time`, pr1.`Unit`,
       pr1.`Value`, (pr2.`Value` - pr1.`Value`)/1000 as totaal
FROM P4Query pq, P4Reading pr1 INNER JOIN
     P4Reading pr2
     ON pr1.`Time` = (pr2.`Time` - INTERVAL 15 minute)
WHERE (pq.`Id` = pr1.`QueryId`)
ORDER BY pr1.`Time` DESC;

結合形式が混在しています。とidの間の条件が欠落しているようにも見えます。これはあなたが望むものかもしれません:pr1pr2

SELECT pq.`MeteringPointId`, pr1.`EnergyMeter`, pr1.`Register`, pr1.`Time`, pr1.`Unit`,
       pr1.`Value`, (pr2.`Value` - pr1.`Value`)/1000 as totaal
FROM P4Query pq join
     P4Reading pr1
     on pq.`Id` = pr1.`QueryId` join
     P4Reading pr2
     ON pq.`Id` = pr2.`QueryId` and
        pr1.`Time` = (pr2.`Time` - INTERVAL 15 minute)
ORDER BY pr1.`Time` DESC;

これにより、追加の結合条件が追加され、結合構文が一貫したものになります。

私は、時間通りにこの状態を疑っています ( pr1.Time = (pr2.Time - INTERVAL 15 minute))。これには、時間値の絶対精度が必要です。多くの状況下では、一定間隔の時間でも数ミリ秒ずれて、等式が失敗する可能性があります。

于 2013-09-09T01:31:40.387 に答える
0

次のクエリを使用します -

SELECT distinct `table2`.`MeteringPointId`, `table1`.`EnergyMeter`, `table1`.`Register`,
   `table1`.`Time`, `table1`.`Unit`, `table1`.`Value`,
  (`table2`.`Value` - `table1`.`Value`)/1000 as totaal
  FROM P4Query table1
INNER JOIN P4Reading table2 ON `table1`.`Time` = (`table2`.`Time` - INTERVAL 15 minute)
 WHERE (`table1`.`Id` = `table2`.`QueryId`)
ORDER BY `table1`.`Time` DESC;
于 2016-06-07T06:11:17.670 に答える
0

私が使用した正しいクエリ:

SELECT pq.`MeteringPointId`, pr1.`EnergyMeter`, pr1.`Register`, 
  pr1.`Time`, pr1.`Unit`, pr1.`Value`, 
 (pr2.`Value` - pr1.`Value`)/1000 as totaal
FROM P4Query pq 
JOIN P4Reading pr1 ON pq.`Id` = pr1.`QueryId` 
JOIN P4Reading pr2 ON pq.`Id` = pr2.`QueryId` 
   AND pr1.`Time` = (pr2.`Time` - INTERVAL 15 minute) 
   AND pr1.`Register` = pr2.`Register`
ORDER BY pr1.`Time` DESC;
于 2013-09-09T18:05:13.777 に答える