在sql server中选择distinct和partition by

时间:2015-10-13 10:29:05

标签: sql sql-server sql-server-2012 window-functions

myTable看起来像这样:

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,我有一组日期(需要使用强制转换(rDate作为DATETIME),值(r)和名称进行转换。  我需要消除同时具有相同id,rDate,r,rName的所有enteries(重复)。  我正在思考以下几点:

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

使用sql server 2012

1 个答案:

答案 0 :(得分: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)无法使用CAST这是无效的,您必须使用ranking function代替dash