2015-10-13 74 views
0

myTable的是這樣的:選擇不同和SQL Server中的分區

id rDate r  rName 
1  41086 0.2 ax_ax03_a 
1  41086 0.2 ax_ax03_a 
1  41086 0.2 ax_ax03_a 
1  41087 0.4 ax_ax03_a 
1  41087 0.4 ax_ax03_a 
2  41086 0.12 ax_ax06_a 
2  41086 0.12 ax_ax06_a 
2  41086 0.12 ax_ax06_a 
2  41087 0.5 ax_ax06_a 
2  41087 0.34 ax_ax06_a 

每一個ID,我有一組日期(需要使用CAST(RDATE爲DATETIME轉換),一個值(r)和一個名字 我需要消除所有同時具有相同的id,rDate,r,rName的輸入(複製) 我正在考慮以下行的內容:

select id,CAST(rDate AS DATETIME) over (partition by rName, id) as rDateNew, rName from myTable 

使用SQL Server 2012

+1

'select distinct * from mytable'將選擇不同的值。您是否嘗試選擇不同的行或刪除重複項? – CFreitas

+0

'select distinct id,CAST(rDATE AS DATETIME)over(由rName,id分區)作爲rDateNew,rName來自myTable' – wiretext

+0

我認爲您可以使用'GROUP BY'排除重複項 – Japongskie

回答

2

你並不需要使用over子句中的情況下,DISTINCT將消除在表中的所有副本:

SELECT DISTINCT id, rDate, r, rName 
FROM Tablename 

但是,如果你需要過濾這些重複根據每個複製組的特定列,例如,如果你需要最新的日期選擇該行,在這種情況下,你應該使用OVER條款:

WITH Ranked 
AS 
(
    SELECT CAST(rDate AS DATETIME) AS Date, 
    ROW_NUMBER() OVER(PARTITION BY rName, id 
         ORDER BY CAST(rDate AS DATETIME) DESC) AS RN, 
    r, rName 
    FROM Tablename 
) 
SELECT * 
FROM Ranked 
WHERE rn = 1; 

這將消除重複,並給你最新的日期行。

請注意,您不能使用CAST(rDate AS DATETIME)over (partition by rName, id)這是無效的,您必須使用ranking function而不是CAST

+0

我需要從'r'中消除值以及每個id的日期(對於每個id在rName中都有一個對應的代碼,並且這個rName和id的組合的值爲一段時間,在我的情況下大約5年)。將'SELECT DISTINCT id,rDate,r,rName FROM Tablename'產生具有相同id,rDate,r,rName的行同時不同或者只是刪除每列上的重複項?我需要在同一時間 – CM2K

+0

@ CM2K - 它會給你不同的值在同一時間**所有四列**。 –

+0

這是非常有用的,今天學到了一些東西。感謝這個例子,我很快就會需要它!祝你有美好的一天,並保持良好的工作! – CM2K