Оператор SQL - SELECT * с MAX () - PullRequest
2 голосов
/ 23 июля 2011

У меня есть 4 столбца с именами ID, EQUIPID, VERSION, DESCRIPTION.Пользователи могут добавлять дополнительные столбцы, поэтому оператор SQL должен быть динамическим.Идентификатор столбца уникален и никогда не будет дублироваться;EQUIPID описывает оборудование, которое означает, что несколько EQUIPID могут быть одинаковыми;и VERSION описывает разницу между одинаковыми записями EQUIPID.

Как я могу запросить SELECT * и получить только один из каждого EQUIPID с наибольшей версией?

Ответы [ 4 ]

3 голосов
/ 23 июля 2011
  SELECT tn.*
    FROM table_name tn
   WHERE tn.version =
          (SELECT MAX(sq.version)
             FROM table_name sq
            WHERE sq.equipid = tn.equipid);

В основном, выберите строки, где версия равна максимальной версии для этого оборудования.

2 голосов
/ 23 июля 2011
select *
from yourtable
where ID in (
   select max(ID)
   from
   yourtable
   where EQUIPID = xxx
);

Внутренний запрос получает самый высокий идентификатор указанного оборудования, затем внешний запрос извлекает остальные данные в этой записи оборудования.

1 голос
/ 23 июля 2011

Вот один из способов сделать это

SELECT yt.* 
FROM   yourtable yt 
       INNER JOIN (SELECT equipid, 
                          Max(version) AS version 
                   FROM   yourtable) AS maxversion 
         ON yt.equipid = maxversion.equipid 
            AND yt.version = maxversion.version; 

Но в зависимости от вашей базы данных вы можете сделать это другими способами. например, используя ROW_NUMBER ()

1 голос
/ 23 июля 2011

1001 * попробовать *

SELECT * FROM table
GROUP BY EquipID
HAVING max(Version)

еще один способ создать временную таблицу, а затем объединить из обеих таблиц

mysql> CREATE TABLE tmp
    -> SELECT name, MAX(Version) AS max_ver
    -> FROM tableName GROUP BY EquipID;
mysql> SELECT t.*
    -> FROM tableName t, tmp
    -> WHERE t.id = tmp.id

ИЛИ используя self JOIN

select *
from tableName tn
where (
   select count(*) from table t
   where t.equipId = tn.equipId and t.version > tn.version
) <= 2;
...