2010-07-26 3 views
3

Например, в таблице есть столбцы MYINDEX и NAME.SQL, как найти строки, которые имеют наибольшее значение определенного столбца

MYINDEX | NAME 
================= 
1  | BOB 
2  | BOB 
3  | CHARLES 

Хо, я нахожу строку с наивысшим значением MYINDEX для конкретного ИМЯ? Например. Я хочу найти ROW-2 для имени «BOB».

+5

Под редакцией, за любовь Бог не описывает таблицы в прозе. –

ответ

12

SELECT Max(MYINDEX) FROM table WHERE NAME = [insertNameHere]

EDIT: чтобы получить всю строку:

Select * //never do this really 
From Table 
Where MYINDEX = (Select Max(MYINDEX) From Table Where Name = [InsertNameHere] 
+2

Он хочет, чтобы весь ряд, а не только макс для этого столбца. –

+0

@ Лукас Хенекс: Не так, как я понял это предварительное редактирование. И также большинство из первых плакатов, поэтому я склонен думать, что моя была правильной интерпретацией, когда я написал ответ. Редактировать, чтобы ответить на его фактический вопрос. – AllenG

+0

Упрощенное редактирование. Но ... его оригинальный, неотредактированный вопрос: «Хо, я нашел строку с наивысшим MYINDEX для конкретного ИМЯ?» обязательно запросил строку :) –

-1

Использование

FROM TABLE SELECT MAX(MYINDEX), NAME GROUP BY NAME 
4
SELECT MAX(MYINDEX) FROM table 
WHERE NAME = 'BOB' 

Для всего ряда, сделайте следующее:

SELECT * FROM table 
WHERE NAME = 'BOB' 
AND MyIndex = (SELECT Max(MYINDEX) from table WHERE NAME = 'BOB') 
0

Если вы хотите увидеть самый высокий показатель по имени = «Bob», используйте:

SELECT MAX(MYINDEX) AS [MaxIndex] 
FROM myTable 
WHERE Name = 'Bob' 
+0

На самом деле я хочу найти ROW с наивысшим индексом для имени, а не только самым высоким индексом для имени. – SharpAffair

3

Есть несколько способов решения этого. Я предполагаю, что могут быть другие столбцы, которые вы хотите от строки, иначе, как говорили другие, просто имя, MAX(my_index) ... GROUP BY name будет работать. Вот несколько примеров:

SELECT 
    MT.name, 
    MT.my_index 
FROM 
(
    SELECT 
     name, 
     MAX(my_index) AS max_my_index 
    FROM 
     My_Table 
    GROUP BY 
     name 
) SQ 
INNER JOIN My_Table MT ON 
    MT.name = SQ.name AND 
    MT.my_index = SQ.max_my_index 

Другое возможное решение:

SELECT 
    MT1.name, 
    MT1.my_index 
FROM 
    My_Table MT1 
WHERE 
    NOT EXISTS 
    (
     SELECT * 
     FROM 
      My_Table MT2 
     WHERE 
      MT2.name = MT1.name AND 
      MT2.my_index > MT1.my_index 
    ) 
0

Если вы хотите, чтобы пропустить внутреннее соединение, вы можете сделать:

SELECT * FROM table WHERE NAME = 'BOB' ORDER BY MYINDEX DESC LIMIT 1; 
Смежные вопросы

 Смежные вопросы