select 在 sql 服务器中区分和分区

select distinct and partition by in 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 as DATETIME)、值 (r) 和名称进行转换。 我需要消除所有同时具有相同 id, rDate, r, rName 的条目(重复项)。 我在考虑以下内容:

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

使用 sql 服务器 2012

您不需要在您的案例中使用 over 子句,DISTINCT 将消除您的 table:

中的所有重复项
SELECT DISTINCT id, rDate, r, rName 
FROM Tablename

但是,如果您需要根据每个重复组中的特定列过滤这些重复项,例如,如果您需要 select 最近日期的行,在这种情况下您应该使用 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