SQL - 根据条件层次结构选择行

时间:2009-08-28 09:24:41

标签: sql

如果对这个问题有一个积极的答案那就太好了......

是否可以根据可能的条件值的顺序进行SQL选择。

例如

Rows
ID Type
2  Dog
2  Cat
4  Cat
5  Cat

正如您所看到的,前两行的ID是相同的。所以我想按照偏好顺序选择每组1行,因此首先选择“Dog”。如果“狗”不存在,则选择“猫”

E.G。

SELECT ID, Type
FROM pets
WHERE Type = "Dog, Cat"
GROUP BY ID

结果将是......

ID Type
2  Dog
4  Cat
5  Cat

4 个答案:

答案 0 :(得分:1)

我不确定你的“真实”要求是什么,但对于你的例子,你可以使用:

SELECT ID, Max(Type)
FROM pets
WHERE Type IN ('Dog', 'Cat')
GROUP BY ID

注意:

  1. 仅当您要限制类型时才需要IN子句。如果您想要查询中包含的所有类型,可以将其删除。
  2. 如果您可以使用排序(按字母顺序或数字顺序)完成对类型进行优先排序的顺序,则此查询有效。如果是这样,将Min或Max与GROUP BY一起使用是最简单,最有效的解决方案。但是,如果您的优先级基于某些特定的排序,查找表等,您将需要一个不同的解决方案,其中您有一个包含优先级的单独表并加入主查询,正如旁观者所回答。

答案 1 :(得分:1)

如果您有另一张表按优先顺序排列您的选项,那么只需执行以下操作:

SELECT pets.ID, pets.Type
FROM pets,petprefs
WHERE pets.Type=petprefs.Type
GROUP BY pets.ID
ORDER BY petprefs.rank

具有较低等级值的类型将始终在具有较高等级的类型之前被选择。

答案 2 :(得分:1)

我完全同意Rax Olgud的回答。也可以添加提示以使用带分区语法的ROW_NUMBER函数 - 您可以编写更复杂的条件(然后是MAX(Type)。然后在WHERE部分中只通过rownum_alias = 1过滤记录

更新

select * from (
select ID, Type, ROW_NUMBER() OVER (PARTITION BY ID ORDER BY Type DESC) rn
FROM #temp
) a where rn = 1

与GROUP BY解决方案相反,这允许在select语句中放置任何列(不仅仅是分组)

答案 3 :(得分:0)

如果分组(如上面的答案中所示)不是选项,请查看SQL Server 2005中引入的排名函数。