SQL Group By & Max を使用した最新情報の取得
一部のシナリオでは、グループ化された最新値または最大値を取得する必要があります。データセット内の特定の列ごとに。このような一般的な集約の 1 つは、値の一意の組み合わせに関する最新情報を見つけることです。
アラームのリストを含む次の表について考えてみましょう:
id | name | alarmId | alarmUnit | alarmLevel |
---|---|---|---|---|
1 | test | voltage | psu | warning |
2 | test | voltage | psu | ceasing |
3 | test | voltage | psu | warning |
4 | test | temp | rcc | warning |
5 | test | temp | rcc | ceasing |
目的は、最新のもののみを取得することです。アラーム ID とアラームユニットの組み合わせごとの情報。期待される結果は次のようになります。
id | name | alarmId | alarmUnit | alarmLevel |
---|---|---|---|---|
3 | test | voltage | psu | warning |
5 | test | temp | rcc | ceasing |
この結果を達成するには、いくつかのアプローチを利用できます。一般的な方法の 1 つは、各グループ内の各行にランクを割り当てる ROW_NUMBER() 関数の使用です。次のクエリは、この関数を利用しています。
SELECT * FROM ( SELECT *, ROW_NUMBER() OVER (PARTITION BY alarmId, alarmUnit ORDER BY id DESC) AS rn FROM mytable ) q WHERE rn = 1
このクエリは、alarmId とalarmUnit の組み合わせごとに最新の行を返します。
ROW_NUMBER() 関数をサポートしていないデータベースの場合MySQL など、別のアプローチを使用することもできます。
SELECT mi.* FROM ( SELECT alarmId, alarmUnit, MAX(id) AS mid FROM mytable GROUP BY alarmId, alarmUnit ) mo JOIN mytable mi ON mi.id = mo.mid
このクエリはサブクエリを利用して、アラーム ID とアラームユニットの各組み合わせの最大 ID を取得し、その結果を元のテーブルと結合して、対応する行を取得します。
PostgreSQL バージョン 8.3 以前では、DISTINCT ON 句を利用できます。
SELECT DISTINCT ON (alarmId, alarmUnit) * FROM mytable ORDER BY alarmId, alarmUnit, id DESC
このクエリは、alarmId と AlarmUnit の組み合わせごとに最初の個別の行を返し、これにより最新の情報が効果的に提供されます。これらのテクニックを活用することで、開発者はデータから最新の値を効率的に取得でき、入手可能な最新情報に基づいて十分な情報に基づいた意思決定を行うことができます。
以上がSQL の「GROUP BY」と「MAX」(または代替手段)を使用して最新の情報を取得するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。