【问题标题】:select registers by condition on group按组上的条件选择寄存器
【发布时间】:2019-02-09 00:10:15
【问题描述】:

假设我有一个表有两列TYPE & COLOR 两列都可以有重复值,但是我需要为 TYPE 列中的每个值获取一个寄存器,并在 COLOR 列中根据层次结构获取值 1 -蓝色、2-绿色、3-黑色、4-红色和最后 5-白色。为了更好地解释我自己,我在图 1 中有表格,而我想要的结果在图 2 中。

我可以使用MIN()GROUP BY 获取TYPE 值,但是如何根据层次结构获取颜色值?

【问题讨论】:

  • 只是为了确定,您是否正在寻找 SELECT 仅从表格定义开始的所有内容?
  • 什么会定义类型和颜色的顺序?
  • 抱歉,SELECT 是我要找的东西
  • @LuisCazares for type column 我只需要为相同的值获取一个寄存器,如果我的值是 91 的五倍,我只需要一个寄存器,但是对于这五个值,我需要检查颜色并根据此获取带有颜色的寄存器,如果这五个相等的五个值具有我需要的蓝色,但如果没有蓝色值搜索绿色,如果没有该值搜索黑色。
  • 我已经删除了我的评论,因为@GordonLinoff 发布了一个答案。这实际上是回答您问题的一种优雅方式。

标签: sql sql-server


【解决方案1】:

这可能是一种方法。

WITH CTE AS(
    SELECT *, ROW_NUMBER() OVER(PARTITION BY type ORDER BY CASE color WHEN 'blue'  THEN 1
                                                                    WHEN 'green' THEN 2
                                                                    WHEN 'black' THEN 3
                                                                    WHEN 'red'   THEN 4
                                                                    WHEN 'white' THEN 5 END) rn
    FROM SomeTable
)
SELECT type, color
FROM CTE
WHERE rn = 1;

【讨论】:

    【解决方案2】:

    这是一种方法:

    select t.*
    from (select t.*,
                 row_number() over (partition by t.type order by v.ord) as seqnum
          from t join
               (values (1, 'blue'), (2, 'green'), (3, 'black'), (4, 'red'), (5, 'white')
               ) v(ord, color)
               on t.color = v.color
         ) t
    where seqnum = 1;
    

    你也可以使用一个巨大的case 表达式和row_number(),但我认为这更容易理解和维护。

    【讨论】:

    • 谢谢戈登,我认为你的回答是最优化的
    【解决方案3】:
    SELECT DISTINCT 
    TYPE
    , LAST_VALUE(COLOR) OVER (PARTITION BY COLOR ORDER BY (SELECT NULL))
    FROM table
    

    但 SQL Server 不保证 COLOR 名称的顺序,除非您有明确的 ORDER BY(而不是 SELECT NULL)的决胜局,例如表 id。 希望您至少拥有 SQL Server 2012,或者可能是 2008 R2 SP3。

    【讨论】:

      猜你喜欢
      • 2021-07-06
      • 2017-10-15
      • 2023-03-13
      • 1970-01-01
      • 2012-01-22
      • 1970-01-01
      • 2010-10-21
      • 2012-07-10
      • 2016-06-04
      相关资源
      最近更新 更多