2016-10-03 2 views
1

Если у меня есть таблица вроде этого:SQL выберите сверху, если столбцы одинаковы

Id StateId Name 
1 1 a 
2 2 b 
3 1 c 
4 1 d 
5 3 e 
6 2 f 

Я хочу, чтобы выбрать, как показано ниже:

Id StateId Name 
4 1 d 
5 3 e 
6 2 f 

Например, Идентификаторы 1,3,4 имеют stateid 1. Итак, выберите строку с максимальным идентификатором, т. Е. 4.

+2

Есть несколько способов сделать это, в зависимости от СУБД. Какие вы используете (оракул, mysql, MSSQL и т. Д.)? – JohnHC

+0

SQL Server 2012 – Ashin

ответ

2

Отказ от ответственности: Я дал этот ответ, прежде чем OP указал фактическую базу данных и, следовательно, избегал использования оконных функций. Для более подходящего ответа см. Ответ от @Tanjim выше.

Это вариант с использованием объединений, которые должны работать на большинстве СУБД.

SELECT t1.* 
FROM yourTable t1 
INNER JOIN 
(
    SELECT StateId, MAX(Id) AS Id 
    FROM yourTable 
    GROUP BY StateId 
) t2 
    ON t1.StateId = t2.StateId AND 
     t1.Id  = t2.Id 
+0

Это не сработает, так как нет необходимости, чтобы записи, имеющие идентификатор от 1,2 ---- так далее, всегда имеют состояние, начинаются с имени от a до z в порядке возрастания. Вместо того, чтобы применять max по имени, его следует применять в столбце id –

+0

@DeepakSharma Извините, вопрос не стал очень ясным. –

+0

«Например, Ids 1,3,4 имеют stateid 1. Итак, выберите строку с max Id, т. Е. 4". это означает, что автор хочет получить записи состояний с max id –

8
; WITH CTE AS 
(
    SELECT *, ROW_NUMBER() OVER(PARTITION BY STATEID ORDER BY ID DESC) AS RN 
)SELECT ID, STATEID, NAME FROM CTE WHERE RN = 1 
+0

@Kingfisher, вы уже пробовали это? – Esty

2

Следующие с использованием подзапроса, чтобы найти максимальный Id для каждого из состояний. Предложение WHERE содержит только строки с идентификаторами из этого подзапроса.

SELECT 
    [Id], [StateID], [Name] 
FROM 
    TABLENAME S1 
WHERE 
    Id IN (SELECT MAX(Id) FROM TABLENAME S2 WHERE S2.StateID = S1.StateID) 
1

Вы можете использовать ROW_NUMBER() + TOP 1 С СВЯЗЕЙ:

SELECT TOP 1 WITH TIES 
     Id, 
     StateId, 
     [Name] 
FROM YourTable 
ORDER BY ROW_NUMBER() OVER (PARTITION BY StateId ORDER BY Id DESC) 

Выход:

Id StateId Name 
4 1  d 
6 2  f 
5 3  e 
Смежные вопросы