【问题标题】:SQL Server : return row from two rows based on the precedence of one over anotherSQL Server:根据一行的优先级从两行返回行
【发布时间】:2021-01-12 04:29:32
【问题描述】:

我有下表,我想根据列值的优先级从中返回记录。

col1 col2 Col3
1 val1 Master
1 val1 Distributor
2 val2 Master
3 val3 Distributor
3 val3 Master
precedence type
1 Master
2 Distributor

这里我有类型 Master 作为优先级 1,类型 Distributor 有优先级 2。所以,如果 Col1Col2 值重复类型 (@987654326 @ 和 Distributor) 然后我想返回 Master 的行,因为它优先于 Distributor

输出

我想要得到的结果是:

col1 col2 Col3
1 val1 Master
2 val2 Master
3 val3 Master

请有人帮我为此输出编写 SQL 查询。

【问题讨论】:

  • 好的,你是怎么做到的?
  • MySQL 和 MS SQL (SQL Server) 是两个不同的 DBMS。请只选择一个并删除错误的标签。如果正确的 DBMS 是 MySQl,那么还要提供精确的服务器版本。

标签: sql-server


【解决方案1】:

您可以将WITH TIES 选项与row_number() 一起使用

Select top 1 with ties *
 From  YourTable
 Order By row_number() over (partition by col1,col2 order by col3 desc)

如果有两个表

Select top 1 with ties A.*
 From  YourTable A
 Join  SeqTable  B on A.Col3=B.Type
 Order By row_number() over (partition by col1,col2 order by B.precedence)

【讨论】:

  • OP 有 2 个表...并且您的查询是特定于 SQL Server 的。
  • @Akina 不能 100% 确定它是第二张桌子还是演示序列。无论哪种方式,我都会添加第二个选项。
【解决方案2】:

您可以使用INNER JOIN和解析函数如下:

select col1, col2, col3 from
(select t1.*,
       row_number() over (partition by t1.col1, t1.col2 order by t2.precedence) as rn
  from table1 t1 join table2 t2 on t1.col3 = t2.precedence) t
where rn = 1

【讨论】:

    【解决方案3】:

    或许可以优化一下,先做aggregation with a minimum,然后合并表拉出 type,再从这一切中选择three fields

    SELECT 
     col1,
     col2,
     type
    FROM  (
        SELECT  *
        FROM  precedence_table
        INNER JOIN
         (
           SELECT 
             col1,
             col2,
             Min(precedence_table.precedence) AS top
           FROM      `my_table`
           LEFT JOIN `precedence_table`
           ON        my_table.col3 = precedence_table.type
           GROUP BY  my_table.col1, my_table.col2) AS agregated
           HAVING    precedence = agregated.top) AS queried 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-11-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-21
      • 2010-09-16
      相关资源
      最近更新 更多