【问题标题】:How to select single row where one field is different? SQL Server如何选择一个字段不同的单行? SQL 服务器
【发布时间】:2020-12-17 18:21:35
【问题描述】:

我有一张如下表:

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

【问题讨论】:

    标签: sql sql-server greatest-n-per-group common-table-expression sql-delete


    【解决方案1】:

    使用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
    

    当两行具有相同的姓名、学校、毕业年份和学位时,查询会按字母顺序保留major 最小的那一行(如果需要,可以更改row_number()order by 子句标准)。

    如果您想要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
    

    【讨论】:

    • 谢谢,row_number() 方法适用于这种情况,我以前没有使用过这种方法,所以一定会注意这一点。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-10
    • 1970-01-01
    • 1970-01-01
    • 2015-09-23
    • 1970-01-01
    • 2011-01-08
    相关资源
    最近更新 更多