2016-07-05 100 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

什麼定義:最新?我假設返回代碼可能是LOWER,但仍然是「最新」 – xQbert

+0

@ siyual,這是我的錯誤糾正了ID的 – 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

這隻會返回一個產品名稱。我想要做的是名稱mach名稱和產品名稱是標識符。所以如果該行具有相同的名稱但產品編號不同,它也會返回兩行。所以像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的ID爲彼得;我認爲「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]返回[name]和最新的[id] – Kino

+0

[JOIN]將最新的id與表中的數據進行匹配 – Kino