在 sql server 中选择 distinct 和 partition by

Posted

技术标签:

【中文标题】在 sql server 中选择 distinct 和 partition by【英文标题】:select distinct and partition by in sql server 【发布时间】:2015-10-13 10:29:04 【问题描述】:

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,我都有一组日期(需要使用 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 server 2012

【问题讨论】:

select distinct * from mytable 将选择不同的值。您是要选择不同的行还是删除重复的行? select distinct id,CAST(rDate AS DATETIME) over (partition by rName, id) as rDateNew, rName from myTable 我认为您可以使用GROUP BY消除重复项 有什么独特之处吗? (例如自动编号的 id) 行中没有独特的东西。对于相同的 id,有多个日期和值。然而,一个 id 对应于名称 【参考方案1】:

您不需要在您的情况下使用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

【讨论】:

我需要从 r 和每个 id 的日期中删除值(每个 id 在 rName 中都有一个对应的代码,并且 rName 和 id 的这个组组合具有一段时间的值时间,在我的情况下大约 5 年)。 SELECT DISTINCT id, rDate, r, rName FROM Tablename 会同时产生具有相同 id、rDate、r、rName 的行,还是只删除每列上的重复项?我同时需要 @CM2K - 它会同时为您提供不同的值跨越所有四列 这很有帮助,今天学到了一些东西。谢谢你的例子,我很快就会需要它!祝你有美好的一天,继续努力! @CM2K - 随时欢迎您。很高兴它对你很有帮助,你也有美好的一天:)

以上是关于在 sql server 中选择 distinct 和 partition by的主要内容,如果未能解决你的问题,请参考以下文章

将 SQL Server 代码转换为 MS Access SQL 代码 - DISTINCT 问题 [重复]

在 SQL Server 中一次性获取 DISTINCT COUNT

如何提高 Sql server 中 Distinct Query 的性能

SQL SERVER 关键字DISTINCT应用

sql 在sql中选择包含多个数据的Distinct行

在一列上选择 DISTINCT,返回多个其他列(SQL Server)