2016-07-05 5 views
1

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

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

же таблица:

ID | name | product | ordernum| return code 
1 john abc  14423  0 
2 john abc   14423 1 
3 peter ade  13324  1432 
4 peter abed  43554  1324 

Так информация возвращение должно выглядеть примерно так.

id | name | product | ordernum | return code | count 
2 john abc  14423   1  2 
4 peter abed  43554  1324  2 

Любые идеи о том, как я могу это сделать?

+2

Почему 'Id'' 1' и '2' для результирующего? – Siyual

+0

Что определяет: последние? Я предполагаю, что коды возврата могут быть НИЖНЕЙ, но все равно быть «последними» – xQbert

+0

@ siyual, что было моей ошибкой, скорректировало идентификатор – CrazyITWannaBe

ответ

2

Вы можете использовать ROW_NUMBER() оконной функцию, чтобы получить результат:

;With Cte As 
(
    Select Id, Name, Product, OrderNum, [Return Code], 
      Row_Number() Over (Partition By Name, Product Order By Id Desc) As RN, 
      Count(*) Over (Partition By Name, Product) As Count 
    From YourTable 
) 
Select Id, Name, Product, OrderNum, [Return Code], Count 
From Cte 
Where RN = 1 
+0

это вернет только одно название продукта. То, что я пытаюсь сделать, это имя имени и имя продукта - это идентификаторы. поэтому, если строка имеет то же имя, но другой номер продукта, она также вернет две строки. Так, например, 1 john abc 2323 1222 и 2 john xyz 2433 2222 будут отображаться по результатам – CrazyITWannaBe

+0

@CrazyITWannaBe. Если это так, то почему в вашем ожидаемом наборе результатов также нет 'peter'' abe'? Или я неверно истолковал ожидаемый результат? – Siyual

+0

, потому что я идиот и был бросился положить это в ... извините – CrazyITWannaBe

2

Вы можете использовать оконные функции:

select t.* 
from (select t.*, 
      row_number() over (partition by name order by id desc) as seqnum, 
      count(*) over (partition by name) as cnt 
     from t 
    ) t 
where seqnum = 1; 

Примечание: это возвращает идентификатор 4 для Петра; Я предполагаю, что «2» - опечатка.

0
;WITH 
cte AS 
(
    SELECT MAX(ID) AS ID, Name, COUNT(Name) OVER(PARTITION BY Name) AS [COUNT] 
    FROM Table 
    GROUP BY Name 
) 
SELECT * 
FROM Table a 
JOIN cte b 
    ON a.ID = b.ID 
    AND a.Name = b.Name 
+0

[cte] возвращает [имя] и последний [id] – Kino

+0

[JOIN] соответствует последнему идентификатору с данными из таблицы – Kino

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