在 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