【问题标题】:ORDER grouped values by custom rank - SQL按自定义排名对值进行排序 - SQL
【发布时间】:2013-08-17 04:11:49
【问题描述】:

我一直在尝试订购我的表中包含的对象的 ID。为此,我使用了以下层次结构,它基于“IN”子句中的属性顺序:

订购方式

第一:匹配所有属性的 ID:'Solid' 和 'Metal' 和 'Red'

第二个:与属性匹配的 ID:'Solid' 和 'Metal'

第三个:只匹配属性的 ID:'Solid'

第四:与属性匹配的 ID:“金属”和“红色”

第五个:只匹配属性的 ID:'Metal'

第六个:只匹配属性的 ID:'Red'

我使用的主要查询是:

SELECT objectattributelink.ID, COUNT(*) Attributes
FROM objectattributelink, attributelist
WHERE objectattributelink.ID = attributelist.AttributeID
AND attributelist.AttributeDesc IN ('Solid', 'Metal', 'Red')
AND objectattributelink.AttributeID BETWEEN 1000 AND 1200
GROUP BY objectattributelink.ID
ORDER BY COUNT(*) DESC

它以简化的顺序返回所有 ID。在这种情况下,顶部的那些(匹配 3 个属性)就可以了,但其余的顺序是随机的。

我当前的解决方案是运行 6 个不同的查询,但我想知道是否可以一次性完成。

我对每个查询所做的基本上是:

一个具有:IN ('Solid', 'Metal', 'Red') 和 HAVING 属性 = 3,第二个具有:IN ('Solid', 'Metal') 和 HAVING 属性 = 2,第三个具有: IN('Solid'),第四个带有:IN('Metal','Red')和HAVING Attributes = 2,第五个带有:IN('Metal')和第六个带有IN('Red')

【问题讨论】:

    标签: sql group-by sql-order-by


    【解决方案1】:

    以下查询进行排序:

    SELECT oal.ID, COUNT(*) Attributes
    FROM objectattributelink oal join
         (select al.*,
                 (case when AttributeDesc = 'Solid' then 1 else 0 end) as IsSolid,
                 (case when AttributeDesc = 'Metal' then 1 else 0 end) as IsMetal,
                 (case when AttributeDesc = 'Red' then 1 else 0 end) as IsRed
          from attributelist al
         ) al
         on oal.ID = al.AttributeID
    where al.AttributeDesc IN ('Solid', 'Metal', 'Red')
    AND oal.AttributeID BETWEEN 1000 AND 1200
    GROUP BY oal.ID
    ORDER BY (case when max(IsSolid) = 1 and max(IsMetal) = 1 and max(IsRed) = 1 then 1
                   when max(IsSolid) = 1 and max(IsMetal) = 1 then 2
                   when max(IsSolid) = 1 then 3
                   when max(IsMetal) = 1 and max(IsRed) = 1 then 4
                   when max(IsMetal) = 1 then 5
                   when max(IsRed) = 1 then 6
              end);
    

    为了便于编写逻辑,查询为每个值引入了三个新变量。然后max() 函数确定该组是否具有这些变量。

    我还修复了连接语法以使用 on 子句并引入表别名以提高可读性。

    编辑:

    我认为您也可以使用 order by

    order by max(IsSolid) * 4 + max(IsMetal) * 2 + max(IsRed);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-05-26
      • 2020-11-05
      • 1970-01-01
      • 2021-12-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-09
      相关资源
      最近更新 更多