SQL Server 2012中如何正确识别Ticker/Date维度的重复数据?
识别Ticker/Date组合重复条目的最佳SQL方法
嘿,我来帮你搞定这个问题!首先咱们先聊聊你遇到的报错——"Incorrect syntax near 'Ticker'",大概率是因为你尝试用COUNT(DISTINCT)同时处理多列导致的,很多SQL数据库并不支持COUNT(DISTINCT Ticker, Date)这种写法,这才触发了语法错误。
下面给你几种实用的方法,根据你的需求选就行:
1. 快速找出有重复的Ticker/Date组合(最简洁)
如果你只是想知道哪些Ticker和Date的组合存在重复,用GROUP BY搭配HAVING是最直接的方案:
SELECT Ticker, Date, COUNT(*) AS 重复条目数 FROM TEMP GROUP BY Ticker, Date HAVING COUNT(*) > 1;
这个语句会把数据按Ticker和Date分组,统计每组的条目数,只返回条目数大于1的组——也就是存在重复的组合。
2. 查看具体的重复行(包含Price列)
如果你需要看到所有重复的具体行(包括对应的Price值),用窗口函数ROW_NUMBER()或者COUNT()会更灵活:
方法A:用ROW_NUMBER()标记重复行
SELECT Ticker, Date, Price FROM ( SELECT Ticker, Date, Price, -- 按Ticker和Date分组,给每行编号 ROW_NUMBER() OVER (PARTITION BY Ticker, Date ORDER BY (SELECT NULL)) AS 行编号 FROM TEMP ) AS 子查询 WHERE 行编号 > 1;
这个查询会给每个Ticker/Date组合里的行依次编号,编号大于1的就是重复的行。如果想保留该组合的所有行(包括第一行),可以把ROW_NUMBER()换成COUNT(*) OVER (PARTITION BY Ticker, Date),然后筛选COUNT > 1即可:
方法B:显示所有重复组合的行
SELECT Ticker, Date, Price FROM ( SELECT Ticker, Date, Price, COUNT(*) OVER (PARTITION BY Ticker, Date) AS 组合总条目数 FROM TEMP ) AS 子查询 WHERE 组合总条目数 > 1;
为什么你之前的语句报错?
举个例子,如果你写了类似下面的语句:
-- 错误写法:多数SQL数据库不支持COUNT(DISTINCT)多列 SELECT COUNT(DISTINCT Ticker, Date) FROM TEMP;
这种写法在很多数据库(比如SQL Server)里是不合法的,这就是你遇到语法错误的原因。改用上面的分组或窗口函数方案就能解决啦。
内容的提问来源于stack exchange,提问作者Coding_Newbie
相关产品推荐
相关产品推荐

