【问题标题】:Select unique record based on column value priority根据列值优先级选择唯一记录
【发布时间】:2012-08-11 12:23:26
【问题描述】:

这是我之前的问题here的延续。

在下面的例子中:

id       PRODUCT ID    COLOUR
1        1001          GREEN
2        1002          GREEN
3        1002          RED
4        1003          RED

给定一个产品 ID,我只想检索一条记录 - 如果存在则为绿色,否则为红色。听起来我需要以某种方式使用 DISTINCT,但我不知道如何提供优先级规则。

我敢肯定,这很基础,但我的 SQL 技能可不仅仅是生疏……

编辑:谢谢大家。请再问一个问题:如何使这与多个记录一起使用,即。如果 WHERE 子句返回不止一条记录? LIMIT 1 将限制整个集合,而我想要限制在每个产品内。

例如,如果我有类似 SELECT * FROM table WHERE productID LIKE "1%" ... 我如何检索每个唯一产品,但仍尊重颜色优先级 (GREEN>RED)?

【问题讨论】:

    标签: sql sqlite select


    【解决方案1】:

    试试这个:

    SELECT top 1 *
    FROM <table>
    WHERE ProductID = <id>
    ORDER BY case when colour ='GREEN' then 1 
                  when colour ='RED' then 2 end
    

    如果要根据其他颜色订购,可以在case语句中给出

    【讨论】:

    • 谢谢,这个案例使它比其他答案更通用,但前 1 个在 sqlite 中不起作用。
    【解决方案2】:
    SELECT * 
    FROM yourtable
    WHERE ProductID = (your id)
    ORDER BY colour 
    LIMIT 1
    

    (你看,绿色会在红色之前出现。LIMIT 子句只返回一条记录)

    对于您的后续编辑,您可以这样做

    select yourtable.*
    from
        yourtable
        inner join 
        (select productid, min(colour) mincolour 
        from yourtable
        where productid like '10%'
        group by productid) v
        on yourtable.productid=v.productid
        and yourtable.colour=v.mincolour    
    

    【讨论】:

    • 见上面的编辑。其他 SQL 具有行编号功能,这使得这更容易,但 SQLite 缺乏这一点。
    • 再次感谢,没想到会这么复杂!
    猜你喜欢
    • 2012-08-08
    • 2020-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多