如何 select 一个字段不同的单行? SQL 服务器
How to select single row where one field is different? SQL Server
我有一个 table 如下所示:
ID NAME SCHOOL GRADUATIONYEAR DEGREE MAJOR
--------------------------------------------------------------------------------------------------
100 Ben University1 2015 Bachelor of Arts Major1
100 Ben University1 2015 Bachelor of Arts Major2
100 Ben University2 2017 Master of Science Major3
由于 Ben 有两条记录来自同一所大学,因为双专业(你可以看到相同的学校、毕业年份和学位),我只想提取其中一条记录而不是两条记录,我拉哪个专业并不重要,只需要一个而不是两个记录。
所以理想情况下,我希望它像下面这样:
ID NAME SCHOOL GRADUATIONYEAR DEGREE MAJOR
--------------------------------------------------------------------------------------------------
100 Ben University1 2015 Bachelor of Arts Major1
100 Ben University2 2017 Master of Science Major3
我试过如下所示进行删除,但这最终会删除所有记录,在这种情况下是否可以使用 CASE?
DELETE FROM #table1
WHERE ID = ID AND NAME = NAME AND SCHOOL = SCHOOL AND DEGREE = DEGREE
使用row_number()
:
select *
from (
select
t.*,
row_number() over(
partition by name, school, graduationyear, degree
order by major
) rn
from mytable t
) t
where rn = 1
当两行的ame、school、graduation year、degree相同时,查询保留最小的major
、alphabetically-wise(可以更改order by
子句row_number()
如果你想要另一个标准)。
如果您想要 delete
语句:
with cte as (
select row_number() over(
partition by name, school, graduationyear, degree
order by major
) rn
from mytable
)
delete from cte where rn > 1
我有一个 table 如下所示:
ID NAME SCHOOL GRADUATIONYEAR DEGREE MAJOR
--------------------------------------------------------------------------------------------------
100 Ben University1 2015 Bachelor of Arts Major1
100 Ben University1 2015 Bachelor of Arts Major2
100 Ben University2 2017 Master of Science Major3
由于 Ben 有两条记录来自同一所大学,因为双专业(你可以看到相同的学校、毕业年份和学位),我只想提取其中一条记录而不是两条记录,我拉哪个专业并不重要,只需要一个而不是两个记录。 所以理想情况下,我希望它像下面这样:
ID NAME SCHOOL GRADUATIONYEAR DEGREE MAJOR
--------------------------------------------------------------------------------------------------
100 Ben University1 2015 Bachelor of Arts Major1
100 Ben University2 2017 Master of Science Major3
我试过如下所示进行删除,但这最终会删除所有记录,在这种情况下是否可以使用 CASE?
DELETE FROM #table1
WHERE ID = ID AND NAME = NAME AND SCHOOL = SCHOOL AND DEGREE = DEGREE
使用row_number()
:
select *
from (
select
t.*,
row_number() over(
partition by name, school, graduationyear, degree
order by major
) rn
from mytable t
) t
where rn = 1
当两行的ame、school、graduation year、degree相同时,查询保留最小的major
、alphabetically-wise(可以更改order by
子句row_number()
如果你想要另一个标准)。
如果您想要 delete
语句:
with cte as (
select row_number() over(
partition by name, school, graduationyear, degree
order by major
) rn
from mytable
)
delete from cte where rn > 1