6

この「tipo_hh」と「tipo_hh_historial」の 2 つの呼び出しがあります。

「id」が両方のテーブルで同じである場合、2 つのテーブル間で結合を作成する必要があります。しかし、テーブル「tipo_hh」の「id」ごとに、「fecha_cambio」と「hora_cambio」の最大値を持つレコードである条件で、テーブル「tipo_hh_historial」の「valor」を選択する必要があります。

「id」は主キーで、テーブル「tipo_hh」の自動インクリメントです。

このようなもの。

これがテーブル「tipo_hh」です

id  nombre
1   Reefer
2   Lavados
3   Dry
4   Despacho

これがテーブル「tipo_hh_historial」です

id  valor   fecha_cambio    hora_cambio
1   1.50    27/06/2013  19:15:05
1   5.50    27/06/2013  19:19:32
1   5.50    27/06/2013  19:20:06
1   2.50    27/06/2013  21:03:30
2   4.66    27/06/2013  19:15:17
2   3.00    27/06/2013  19:20:22
3   5.00    27/06/2013  19:20:32
4   1.50    27/06/2013  19:20:50

そして、私はこれが必要です:

id  nombre     valor
1   Reefer     2.50
2   Lavados    3.00
3   Dry        5.00
4   Despacho   1.50
4

4 に答える 4

4

サブクエリを使用して、各 ID の履歴レコードの最大日付/時刻を取得し、それを使用して残りの最新の履歴レコードを取得します:-

SELECT tipo_hh.id, tipo_hh.nombre, tipo_hh_historial.valor
FROM tipo_hh
INNER JOIN 
(
    SELECT id, MAX(STR_TO_DATE(CONCAT(fecha_cambio, hora_cambio), '%d/%m/%Y%k:%i:%s')) AS MaxDateTime
    FROM tipo_hh_historial
    GROUP BY id
) Sub1
ON tipo_hh.id = Sub1.id
INNER JOIN tipo_hh_historial
ON tipo_hh_historial.id = Sub1.id
AND STR_TO_DATE(CONCAT(fecha_cambio, hora_cambio), '%d/%m/%Y%k:%i:%s') = Sub1.MaxDateTime

SQL フィドル:-

http://www.sqlfiddle.com/#!2/68baa/2

于 2014-03-07T10:23:18.473 に答える
3

まず第一に、日付のように列に適切なデータ型を使用する必要があります。サンプルデータセットの時間列と同じ型のデータの列が必要です。日付は'%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)

更新されたフィドルのデモ

于 2014-03-06T16:32:33.903 に答える
0

これを試して:

SELECT A.id, B.nombre, A.valor, MAX(A.hora_cambio) AS hora_cambio_time
FROM tipo_hh_historial AS A
INNER JOIN tipo_hh AS B
ON(A.id = B.id)
GROUP BY A.id
于 2013-06-28T06:43:43.763 に答える