从表中筛选选定的数据

问题描述:

我试图只返回所需的数据,但无法弄清楚只能得到请求的数据的方法。我遇到的问题是表格可能有多个相同的记录,但一列用不同的数据更新。从表中筛选选定的数据

我想要做的是获取最新的入口返回代码以及名称,产品和记录的名称和产品计数。

同桌:

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

什么定义:最新?我假设返回代码可能是LOWER,但仍然是“最新” – xQbert

+0

@ siyual,这是我的错误纠正了ID的 – CrazyITWannaBe

您可以使用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

这只会返回一个产品名称。我想要做的是名称mach名称和产品名称是标识符。所以如果该行具有相同的名称但产品编号不同,它也会返回两行。所以像1 john abc 2323 1222和2 john xyz 2433 2222会在结果上显示 – CrazyITWannaBe

+0

@CrazyITWannaBe如果是这样的话,为什么在预期的结果集中不是'peter'' abe'?或者我误解了你的预期结果? – Siyual

+0

因为我是一个白痴,并匆忙把这个在...对不起 – CrazyITWannaBe

您可以使用窗口函数:

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的ID为彼得;我认为“2”是一个错字。

;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]返回[name]和最新的[id] – Kino

+0

[JOIN]将最新的id与表中的数据进行匹配 – Kino