【问题标题】:Remove duplicates from my SQL query results从我的 SQL 查询结果中删除重复项
【发布时间】:2021-06-08 09:04:51
【问题描述】:

我有以下 SQL 查询:

SELECT DISTINCT(MovieAttributes.Description),
    MDetails.AttributeValueID, MovieAtrVal.Value
FROM 
    MDetails 
INNER JOIN 
    MovieAtrVal ON MovieAtrVal.AtrValID = MDetails.AttributeValueID
INNER JOIN 
    MovieAttributes ON MovieAttributes.ID = MovieAtrVal.AtrID 
WHERE 
    MovieID IN (SELECT Movie.ID 
                FROM Movie 
                INNER JOIN Subjects ON Subjects.ID = Movie.SubjectID 
                WHERE Subjects.Name LIKE '308') 
    AND MovieAttributes.Description != 'Environment'

输出是这样的:

RoadInfrastructure      1   None
Hairstyle               5   Short hair
Weather                 8   Sunny
Glasses                 18  Corrective glasses
Beard                   28  No beard
Age                     31  Young (17 to 35)
Age                     32  Middle (36 to 55)
RoadType                34  City
Accessories             38  None
Makeup                  44  None
FacialFeatures          47  None
RoadType                177 None
Weather                 178 Artificial light
Seating_height          206 83
Display_distance        220 67

我想要 2x age、2x RoadType 和 2xWeather

我认为我应该使用 DISTINCT,但在这种情况下不起作用。

【问题讨论】:

  • 当然,您研究了您的问题,发现有 100 多个问题都在问同样的问题。为什么这些解决方案对您不起作用?
  • SQL 中的 DISTINCT 仅适用于 整行 - 而不是单列。您的完整行都不是重复的
  • 用您正在使用的数据库标记您的问题。

标签: sql distinct


【解决方案1】:

不使用distinct,而是通过按attributevalueid排序的描述获取分区的最上面的行

WITH aux AS (
    SELECT
        movieattributes.description,
        mdetails.attributevalueid,
        movieatrval.value,
        ROW_NUMBER() OVER(
            PARTITION BY movieattributes.description
            ORDER BY
                mdetails.attributevalueid
        ) rn
    FROM
        mdetails
        INNER JOIN movieatrval ON movieatrval.atrvalid = mdetails.attributevalueid
        INNER JOIN movieattributes ON movieattributes.id = movieatrval.atrid
    WHERE
        movieid IN (
            SELECT
                movie.id
            FROM
                movie
                INNER JOIN subjects ON subjects.id = movie.subjectid
            WHERE
                subjects.name LIKE '308'
        )
        AND movieattributes.description != 'Environment'
)
SELECT
    *
FROM
    aux
WHERE
    rn = 1

【讨论】:

    猜你喜欢
    • 2020-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-03
    • 1970-01-01
    • 2021-07-13
    • 1970-01-01
    相关资源
    最近更新 更多