首页 > 解决方案 > 如何在 SQL 中将 cell1 与 cell 2 组 2 进行比较

问题描述

我需要一种方法来比较两个块中的单元格。需要将 D2 与 D3 进行比较,将 D4 与 D5 进行比较 ... D10 与 D11 进行比较。

如果两个单独的单元格(如 D2 或 D3)等于“业务”或“合规性”,则返回 true。

如果一个块具有相同的值,如单元格 D6 和 D7 中的“业务”或单元格 D10 和 D11 中的“合规性”,则代码应返回失败。

在此处输入图像描述

create table data
(
  ID int,
  [Col A]  nvarchar(10),
  [Col B]  nvarchar(10),
  [Col C] nvarchar(10)
);

insert into data (ID, [Col C]) values
(1, 'Business'),
(2, 'Compliance'),
(3, 'Compliance'),
(4, 'Business'),
(5, 'Business'),
(6, 'Business'),
(7, 'Compliance'),
(8, 'Business'),
(9,'Compliance'),
(10,'Compliance');

select d.ID,
       d.[Col C],
       case when ( d.[Col C] = coalesce(lag(d.[Col C]) over(order by d.ID), '')
               and d.[Col C] = coalesce(lead(d.[Col C]) over(order by d.ID), '') ) then 'FAIL'
            when d.[Col C] <> coalesce(lag(d.[Col C]) over(order by d.ID), '')     then 'Ok'
            when d.[Col C] <> coalesce(lead(d.[Col C]) over(order by d.ID), '')    then 'Ok'
       end as B
from data d
order by d.ID;

小提琴

标签: sqlsql-server

解决方案


使用窗口函数比较组中的行:

select d.*,
       (case when min(c) over (partition by (id - 1) / 2) = max(c) over (partition by (id - 1) / 2)
             then 'fail' else 'ok'
        end)
from data d

是一个 db<>fiddle。

注意:这假设id没有间隙。如果是这样,您可以使用它row_number()来计算一个序列。


推荐阅读