请耐心等待我,因为我是SQL Server新手。我正在处理一个大约有2850人的数据集,他们出现了多次,大约有18,500行,所以虽然我可以手动编辑这个,但这需要一段时间。我想做以下事情:
SELECT DISTINCT ID, RACE
INTO new_table
FROM table_name;
但事实证明我的比赛数据并未得到很好的清理。如下所示,人物27已被列为白人和西班牙裔。不是每个人都有这个问题,但很多人都这样做。
+----+----------+
| ID | RACE |
+----+----------+
| 27 | Hispanic |
| 27 | Hispanic |
| 27 | White |
| 27 | White |
| 27 | White |
| 27 | White |
+----+----------+
我想要运行数据,使用列出最多的种族实例,并将其重新分配给它们,以便我可以选择SELECT DISTINCT。所以它将从上表转到:
+----+----------+
| ID | RACE |
+----+----------+
| 27 | White |
| 27 | White |
| 27 | White |
| 27 | White |
| 27 | White |
| 27 | White |
+----+----------+
我意识到这可能需要多个步骤,但是任何人都知道如何做到这一点,而不是手工清理,或者在Stata或Excel中进行清理?谢谢!
答案 0 :(得分:0)
您可以使用row_number()
和聚合:
SELECT ID, RACE
INTO new_table
FROM (SELECT id, race, count(*) as cnt,
ROW_NUMBER() OVER (PARTITION BY id ORDER BY COUNT(*) DESC) as seqnum
FROM table_name
GROUP BY id, race
) ir
WHERE seqnum = 1;
注意:如果有关系,这将任意选择一个种族。
ROW_NUBMER()
是一个窗口/排名函数。它将从1开始的序号分配给由PARTITION BY
子句定义的每个组。排序由ORDER BY
指定。所以,价值" 1"被分配给每个COUNT(*)
具有最大id
值的行。 。 。外WHERE
选择此行。
答案 1 :(得分:0)
这可能不是最佳或最有效的方法,但我会使用row_number()
和common table expression
的组合。
仅使用您提供的数据,这对我有用:
create table #temp (
id int,
race varchar(10)
)
insert into #temp
select 27, 'Hispanic'
union all select 27, 'Hispanic'
union all select 27, 'White'
union all select 27, 'White'
union all select 27, 'White'
union all select 27, 'White'
with foo
as (
select id,
race,
row_number() over (partition by id, race order by id, race) as cnt
from #temp
)
update #temp
set race = (
select top 1 race
from foo
where id = #temp.id
order by cnt desc
)
select *
from #temp
我建议先备份您的数据,以防出现问题。
我还提供了一个SQLFiddle链接,但该网站目前似乎没有响应。