まず第一に、日付のように列に適切なデータ型を使用する必要があります。サンプルデータセットの時間列と同じ型のデータの列が必要です。日付は'%d/%m/%Y'
IDとしてフォーマットされています。これは標準形式に変更できます。'%Y-%m-%d'
これは良いでしょうそのため、以下のクエリは列の適切なタイプ用です
SELECT t.* ,new_tipo_hh_historial.`valor`
FROM tipo_hh_new t
JOIN (
SELECT th.*
FROM tipo_hh_historial_new th
JOIN (
SELECT id,valor,
MAX(fecha_cambio ) fecha_cambio
,MAX(hora_cambio) hora_cambio
FROM `tipo_hh_historial_new`
GROUP BY id
) thh
ON (
th.`id` =thh.`id`
AND th.fecha_cambio=thh.`fecha_cambio`
AND th.hora_cambio = thh.`hora_cambio`
)
) new_tipo_hh_historial
USING (id)
また、日付と時刻が文字列として保存されている場合は、クエリの下で使用できる実際の型としてフォーマットする必要がありますが、お勧めしません
SELECT t.* ,new_tipo_hh_historial.`valor`
FROM tipo_hh t
JOIN (
SELECT th.*
FROM tipo_hh_historial th
JOIN (
SELECT id,valor,
MAX(STR_TO_DATE(fecha_cambio , '%d/%m/%Y')) fecha_cambio
,MAX(TIME_FORMAT(hora_cambio,'%H:%i:%s')) hora_cambio
FROM `tipo_hh_historial`
GROUP BY id
) thh
ON (
th.`id` =thh.`id`
AND STR_TO_DATE(th.fecha_cambio , '%d/%m/%Y')=thh.`fecha_cambio`
AND TIME_FORMAT(th.hora_cambio,'%H:%i:%s') = thh.`hora_cambio`
)
) new_tipo_hh_historial
USING (id)
あなたの問題は問題のように見えるgreatest-n-per-groupので、最初にテーブルのtipo_hh_historial
最大値から最大値を取得し、複数の条件で自己結合して、次のような最大値を取得する必要がありfecha_cambio
ますhora_cambio
ON (
th.`id` =thh.`id`
AND th.fecha_cambio=thh.`fecha_cambio`
AND th.hora_cambio = thh.`hora_cambio`
)
次に、最初のテーブルと結合して、期待される結果を取得します
編集: @Kickstart によって発見された問題は彼が既に回答したので、克服する別の方法を提供しfecha_cambio DATETIME
ます。日付と時刻の最大値。以下の更新されたクエリを参照してください
SELECT t.* ,new_tipo_hh_historial.`valor`
FROM tipo_hh_new t
JOIN (
SELECT th.*
FROM tipo_hh_historial_alter th
JOIN (
SELECT id,valor,
MAX(fecha_cambio ) fecha_cambio
FROM `tipo_hh_historial_alter`
GROUP BY id
) thh
ON (
th.`id` =thh.`id`
AND th.fecha_cambio=thh.`fecha_cambio`
)
) new_tipo_hh_historial
USING (id)