2017-09-25 16 views
-1

これは私の現在のSQLクエリです:グループ

SELECT `room_id`, `target_date`, `rate_per_room`, `max_room`, MAX(`version`) 
    FROM `t0311_room_rate` 
     WHERE `room_id` = ? 
      AND `target_date` >= ? 
      AND `target_date` is not null 
      GROUP BY `target_date` 
      ORDER BY `target_date` 

これらは私がtarget_dateを照会すると、私は3つのレコードを取得する必要があり、私のサンプルデータ

enter image description here

です> =今日、それはそうです。 しかし、バージョンとrate_per_roomは計算されません。例えばバージョン12の場合は 、私は195になるはずですが、代わりに190が得られます。

私の質問に欠けている部分はありますか?

あなたがMAX(rate_per_room)をしたいよう

+0

'SELECT' room_id'、 'target_date'、' rate_per_room'、 'max_room' ... GROUP BY' target_date'は無効なSQLです.. MySQLはGRに名前のないカラムのランダムな結果を返すことができますOUP BY ...を読んでください。https://www.psce.com/en/blog/2012/05/15/mysql-mistakes-do-you-use-group-by-correctly/ –

+0

あなたの質問は意味をなさない。走ってはいけません。 target_date 2017-10-01のrate_per_roomの値はどれですか? – Eric

答えて

1

が鳴りありがとうございます。他の非集計列もGROUP BYに追加する必要があります。ほとんどのRDBMSではこれを行うことができますが、MySQLは「特別」です。

SELECT `room_id`, `target_date`, MAX(`rate_per_room`), `max_room`, MAX(`version`) 
FROM `t0311_room_rate` 
WHERE `room_id` = ? 
AND `target_date` >= ? 
AND `target_date` is not null 
GROUP BY `room_id`, `target_date`, `max_room` 
ORDER BY `target_date` 

編集:

MAX(version)は常にMAX(rate_per_room)と一致しませんので、あなたはMAX(version)は、まず取得する必要があり、その後、残りのデータのためのバックテーブルにJOIN

SELECT b.room_id, b.target_date, b.rate_per_room, b.max_room, a.version 
FROM (SELECT room_id, MAX(Version) as version 
     FROM t0311_room_rate 
     GROUP BY room_id) a 
INNER JOIN t0311_room_rate b on a.room_id = b.room_id 
          and a.version = b.version 
--Add filters as desired 
ORDER BY target_date 
+0

私はまだすべての日付の最大バージョンのためのrate_per_roomを得ることができません。 バージョンは正しいですが、rate_per_roomはまだ正しくありません。 –

+0

@BrianRuchiadi私は誤って各列の最大値が必要だと信じていました。私の編集を参照してください。この方法で各部屋の 'max(version)'を特定し、テーブルに戻って 'max(version)'に関連するすべてのデータを取得します。 –