DROP TABLE IF EXISTS my_table;
CREATE TABLE my_table
(id INT NOT NULL
, value1 DECIMAL(5,2) NOT NULL
, value2 DECIMAL(5,2) NOT NULL
, date DATETIME NOT NULL
, PRIMARY KEY(id,date)
);
INSERT INTO my_table VALUES
(1 ,64.2 ,10.1 ,'2017-01-06 10:20:00'),
(2 ,20.2 ,2.5 ,'2017-01-06 10:19:30'),
(2 ,20.3 ,2.4 ,'2017-01-06 10:19:10'),
(1 ,63.8 ,10.0 ,'2017-01-06 10:19:00'),
(3 ,20.0 ,9.9 ,'2017-01-06 10:18:30'),
(2 ,20.1 ,2.4 ,'2017-01-06 10:18:00'),
(3 ,19.9 ,5.0 ,'2017-01-06 10:17:59');
ここに1つのアイデアがあります。それはより一般的な場合に拡張することができないので、それは、うまくスケール、そして唯一の「第二最高の結果」の具体例のために働くしません:
SELECT x.*
FROM my_table x
JOIN
(SELECT a.id
, MAX(a.date) date
FROM my_table a
WHERE date NOT IN (SELECT MAX(date) FROM my_table WHERE id = a.id GROUP BY id)
GROUP
BY id
) y
ON y.date = x.date
AND y.id = x.id;
+----+--------+--------+---------------------+
| id | value1 | value2 | date |
+----+--------+--------+---------------------+
| 1 | 63.80 | 10.00 | 2017-01-06 10:19:00 |
| 2 | 20.30 | 2.40 | 2017-01-06 10:19:10 |
| 3 | 19.90 | 5.00 | 2017-01-06 10:17:59 |
+----+--------+--------+---------------------+
はここで別のアイデアです。それはうまくスケールされ、より一般的なケースに簡単に拡張されます(つまり、i = 3の場合)。
SELECT id
, value1
, value2
, date
FROM
(SELECT x.*
, CASE WHEN @prev=id THEN @i:[email protected]+1 ELSE @i:=1 END i
, @prev := id prev
FROM my_table x
, (SELECT @prev:=null,@i:=0) vars ORDER BY id,date DESC) a
WHERE i = 2;
+----+--------+--------+---------------------+
| id | value1 | value2 | date |
+----+--------+--------+---------------------+
| 1 | 63.80 | 10.00 | 2017-01-06 10:19:00 |
| 2 | 20.30 | 2.40 | 2017-01-06 10:19:10 |
| 3 | 19.90 | 5.00 | 2017-01-06 10:17:59 |
+----+--------+--------+---------------------+
サンプルデータと期待される出力を示してください。 –
サブクエリはどこにありますか – e4c5
@ e4c5私はOPがサブクエリを含む彼の問題を解決するための代替ルートを想像していると思います。 –