2014-02-09 4 views
0

У меня есть следующая таблица:SQL запросы - Выберите максимальное значение столбца для таблицы

ProductID, GroupID, Description 
1   100  Blah blah 
2   200  Blah blah 
3   100  Blah blah 
4   200  Blah blah 
5   200  Blah blah 
6   100  Blah blah 
7   300  Blah blah 
9   300  Blah blah 
10   100  Blah blah 

Мне нужно выполнить запрос, который получает данные для этой таблицы, так что каждый GroupID извлекаются только один раз, и верхние выбирается только ProductID. Пример показан ниже

ProductID, GroupID, Description 
10   100  Blah blah 
5   200  Blah blah 
9   300  Blah blah 

Любые мысли о наилучшем подходе для этого? Цель состоит в том, чтобы каждый раз, когда этот запрос запускался, он всегда получает последний идентификатор продукта для каждого конкретного идентификатора группы. В этой таблице больше полей, но я упрощаю это в этом примере, что в основном иллюстрирует основную проблему, которую я пытаюсь решить.

Спасибо!

+0

Пожалуйста, смотрите ниже ответ, первый я вниз проголосовали bcoz я не можите понять ваш question.Now ответ отредактированы и иметь смысл –

ответ

1

Вы можете попробовать это ( не тестировалось):

SELECT t.ProductID, t.GroupID, t.Description 
FROM MyTableName t 
    INNER JOIN 
     (SELECT MAX(ProductID) As ProductID, GroupID 
     FROM MyTableName 
     GROUP BY GroupID) as maxPerGroup 
    ON maxPerGroup.ProductID = t.ProductID 

SQL fiddle demo

+0

объяснить downvote. запрос отлично работает в моем понимании вопроса. – har07

+0

Да, я протестировал его. он работает нормально. Если кто-то его понизил. то это не хорошо. Чтобы все что угодно, у вас должна быть веская причина. –

-1

К сожалению первый я не можите понимаю ваш вопрос, поэтому я вниз Проголосовали. Ниже приведен отредактированный правильный и проверенный запрос.

ваши записи:

select * from dbo.[Products] 

enter image description here

Показаны Distinct GroupID с верхним ProductID

;with cteProducts(ProductID , GroupID) AS 
(
select max(ProductID) ProductID , GroupID 
FROM dbo.Products od 
Group by GroupID 
) 
SELECT p1.ProductID,p1.GroupID,p1.[Description] from Products p1 
INNER JOIN cteProducts p2 on p1.ProductID=p2.ProductID 
order by p1.ProductID Desc 

Ваш требуемый результат выполнен здесь:

enter image description here

1

Вы захотите использовать предложение OVER, чтобы разбить таблицу на GroupId. Это даст вам таблицу с двумя столбцами: productId и rowNum. rowNum будет 1 для самого высокого ProductID в каждом GroupID. Далее, вы просто внутреннее соединение к этой таблице и получить ProductIDs, которые имеют RowNum в 1. Более подробной информации о предложении OVER может быть found here

SELECT yt1.* 
FROM yourTable yt1 
INNER JOIN ( 
    SELECT ROW_NUMBER() OVER(PARTITION BY GroupID ORDER BY ProductId DESC) as rowNum 
    , ProductID FROM yourTable 
    )yt2 
ON yt1.ProductID = yt2.ProductID 
WHERE yt2.rowNum = 1 
-1

В PostgreSQL это работает.Пожалуйста, проверьте в SQL Server -

select t.productid, t.groupid, t.description from t, (select max(productid) mp , groupid from t group by groupid) x where t.productid=x.mp; 
; 
productid | groupid | description 
-----------+---------+------------- 
     5 |  200 | BLAH BLAH 
     9 |  300 | BLAH BLAH 
     10 |  100 | BLAH BLAH 
(3 rows) 
+0

Почему я проголосовал? – Jayadevan

0

Попробуйте этот запрос

выберите * из продуктов;

+-----------+---------+-------------+ 
| productId | groupId | description | 
+-----------+---------+-------------+ 
|   1 |  100 | hello  | 
|   2 |  200 | hello  | 
|   3 |  100 | hello  | 
|   4 |  200 | hello  | 
|   5 |  200 | hello  | 
|   6 |  100 | hello  | 
|   7 |  300 | hello  | 
|   8 |  300 | hello  | 
|   9 |  100 | hello  | 
|  10 |  200 | hello  | 
+-----------+---------+-------------+ 

выберите * из продуктов, где в PRODUCTID (выберите MAX (ProductID) из группы продуктов по GroupID) упорядочить по GroupID ASC;

+-----------+---------+-------------+ 
| productId | groupId | description | 
+-----------+---------+-------------+ 
|   9 |  100 | hello  | 
|  10 |  200 | hello  | 
|   8 |  300 | hello  | 
+-----------+---------+-------------+ 
1

Для таких задач, как этот, я всегда люблю использовать Ranking:

SELECT ProductID, GroupID, Description FROM 
(
    SELECT 
     t.ProductID 
     ,t.GroupID 
     ,t.Description  
     ,RANK() OVER (PARTITION BY t.GroupID ORDER BY t.ProductID DESC) [Rank] 
    FROM MyTableName t 

) RawData 
WHERE RANK = 1 

В общем, внутренний запрос просто дает ряды для каждой строки, в контексте его GroupID
(это сделано RANK() OVER (PARTITION BY t.GroupID ORDER BY t.ProductID DESC).

Запрос на упаковку предназначен только для фильтрации строк, имеющих ранг 1, где productID является самым высоким в контексте конкретного GroupID.

Вы можете просмотреть результаты в этом Fiddle demo

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