3

私のデータベースには次のものがあります。

ID      datetime             type   value
1094    2013-09-25 09:11:18  HDD      89%
1094    2013-09-25 09:11:18  CPU      55%
1093    2013-09-25 09:11:18  HDD      77%
1093    2013-09-25 09:11:18  CPU      55%
1094    2013-09-25 08:21:28  HDD      85%
1094    2013-09-25 08:21:28  CPU      11%
1093    2013-09-25 07:04:00  HDD      76%

すべての ID とタイプのレコードの最終日付を取得したい:

1094    2013-09-25 09:11:18  HDD      89%
1094    2013-09-25 09:11:18  CPU      55%
1093    2013-09-25 09:11:18  HDD      77%
1093    2013-09-25 09:11:18  CPU      55%
4

2 に答える 2

16

を使用できますGROUP BYが、その仕組みを理解することが重要です。

行のグループを使用GROUP BYすると、句で使用されていない他の列に表示されるものが1つに折りたたまれ、GROUP BY集計関数を使用するか、そのグループからのランダムな行であるかのいずれかによって決定されます。MAX()値または使用した集計関数を保持する表示された行に対応する行を確実に取得することはできません。これは、次のようなクエリを実行すると特に明白になります。

SELECT id, MIN(whatever), MAX(whatever), another_column
FROM your_table
GROUP BY id

「another_column」は、MIN() 値または MAX() 値を保持する行、またはまったく表示されていない別の行に属することさえできます。MySQL 以外の RDBMS では、GROUP BYユーザーが間違いを犯したり、正しい結果が得られたと考えたりするのを防ぐために、集計関数を使用しないか、句にリストされていない列を選択することは実際には禁止されています。

したがって、あなたの場合、列「値」も表示したいようです。上記の理由から、juergen_d の答えは間違っています。なぜなら、それは「値」を選択していないからです。「値」でグループ化されているため、Filipe Silvaの答えは間違っています。これを行うと、実際にテーブル全体が返されます。MAX()関数を2回使用すると最大値が得られますが、明らかにdatetime値に対応する値ではないため、Romeshの答えは間違っています。

それで、どうやってそれをしなければなりませんか?ここでは 3 つの方法について説明します。それらを自分で適用して学びます。それほど難しいことではありません:)

于 2013-10-22T10:19:47.637 に答える
3
select id, type, max(datetime)
from your_table
group by id, type
于 2013-10-22T09:57:42.403 に答える