Sql 如何将第一行与下面的N行进行比较

Sql 如何将第一行与下面的N行进行比较,sql,sql-server,tsql,Sql,Sql Server,Tsql,我们需要如何比较第一行和下面的行。 我有样本数据 tbl_Name Emp_cnt Emp1 20 Emp1 20 Emp1 20 Emp2 22 Emp2 21 Emp2 20 如何将员工姓名与下面的行进行比较。如果下面的行重复,则需要显示“Y”条件,否则为“N”条件 输出: tbl_Name Emp_cnt condition Emp1 20 Y E

我们需要如何比较第一行和下面的行。 我有样本数据

tbl_Name    Emp_cnt
Emp1         20
Emp1         20
Emp1         20
Emp2         22
Emp2         21
Emp2         20
如何将员工姓名与下面的行进行比较。如果下面的行重复,则需要显示“Y”条件,否则为“N”条件

输出:

tbl_Name    Emp_cnt condition
Emp1         20          Y
Emp1         20
Emp1         20
Emp2         22          N
Emp2         21
Emp2         20
请您对此提出建议。

您可以将case expression与exists一起使用:


我的建议将通过一个整齐的分组绕过随机排序顺序的问题:

DECLARE @mockup TABLE (EmpName VARCHAR(50), Emp_cnt INT)
INSERT INTO @mockup VALUES
('Emp1', 20),
('Emp1', 20),
('Emp1', 20),
('Emp2', 22),
('Emp2', 21),
('Emp2', 20);
-根据Emp\u cnt中只有一个或多个值,查询将为每个员工返回一行Y或N:

结果

EmpName condition
Emp1    Y
Emp2    N
使现代化 如前所述,在没有明确排序顺序的情况下,第一行没有意义。因此,您需要的输出是随机的

那么这个呢:

SELECT m1.EmpName
      ,CASE COUNT(DISTINCT m1.Emp_cnt) WHEN 1 THEN 'Y' ELSE 'N' END AS condition 
      ,STUFF(
        (SELECT CONCAT(', ',Emp_cnt ) FROM @mockup m2 WHERE m1.EmpName=m2.EmpName GROUP BY Emp_cnt FOR XML PATH('')),1,2,'') AS Cnt_Values
FROM @mockup m1
GROUP BY m1.EmpName
结果是:

EmpName condition   Cnt_Values
Emp1    Y           20
Emp2    N           20, 21, 22
更新2 这是您似乎需要的,但请注意:在我看来,从技术上讲,这是一种非常糟糕的方法:

SELECT m1.EmpName
      ,m1.Emp_cnt
      ,CASE WHEN ROW_NUMBER() OVER(PARTITION BY EmpName ORDER BY Emp_cnt) = 1 
            THEN (SELECT CASE WHEN COUNT(DISTINCT Emp_cnt)=1 THEN 'Y' ELSE 'N' END FROM @mockup AS m2 WHERE m2.EmpName=m1.EmpName ) 
            ELSE ''  END AS condition   
FROM @mockup m1;

这可以通过在公共表表达式中使用一些窗口函数根据您的问题来完成,尽管我一生都无法理解您为什么要这样做

如果EmpName有一些重复的值,但不是全部,那么您想做什么是不明确的,这目前被视为一个N条件,因为并非下面的所有行都是重复的:

declare @t table (EmpName varchar(50), Emp_cnt int);
insert into @t values('Emp1', 20),('Emp1', 20),('Emp1', 20),('Emp2', 22),('Emp2', 21),('Emp2', 20),('Emp3', 21),('Emp3', 21),('Emp3', 20);

with r as
(
    select EmpName
            ,Emp_cnt
            ,row_number() over (partition by EmpName order by Emp_cnt) as rne
            ,count(EmpName)  over (partition by EmpName, Emp_cnt order by Emp_cnt) as c
    from @t
)
,rg as
(
    select *
        ,row_number() over (order by EmpName, rne) as rn
    from r
)
select EmpName
        ,Emp_cnt
        ,case when rne = 1 and c = 3
                then 'Y'
            when rne = 1 and c = 1
                then 'N'
            else ''
            end as condition
from rg;
输出
只要不指定顺序,SQL表就没有第一行和第二行以下的行。为什么第一行应该有Y,而不是第二行或第三行?没有什么规定一排应该排在另一排之前。是否有一些东西可以用于排序,例如ID或日期?数据库表中的行本质上是不排序的。没有第一行。如果值为20/21/21怎么办?@GordonLinoff条件应为N如果所有三行都重复,则Y条件非常感谢,但需要按行显示,而不是以逗号显示separated@mohan111我很高兴帮助你。只是一个小小的提示:如果你喜欢这个,你可能想投票。接受和投票是两个独立的步骤。。。Thx和快乐编码!
SELECT m1.EmpName
      ,m1.Emp_cnt
      ,CASE WHEN ROW_NUMBER() OVER(PARTITION BY EmpName ORDER BY Emp_cnt) = 1 
            THEN (SELECT CASE WHEN COUNT(DISTINCT Emp_cnt)=1 THEN 'Y' ELSE 'N' END FROM @mockup AS m2 WHERE m2.EmpName=m1.EmpName ) 
            ELSE ''  END AS condition   
FROM @mockup m1;
declare @t table (EmpName varchar(50), Emp_cnt int);
insert into @t values('Emp1', 20),('Emp1', 20),('Emp1', 20),('Emp2', 22),('Emp2', 21),('Emp2', 20),('Emp3', 21),('Emp3', 21),('Emp3', 20);

with r as
(
    select EmpName
            ,Emp_cnt
            ,row_number() over (partition by EmpName order by Emp_cnt) as rne
            ,count(EmpName)  over (partition by EmpName, Emp_cnt order by Emp_cnt) as c
    from @t
)
,rg as
(
    select *
        ,row_number() over (order by EmpName, rne) as rn
    from r
)
select EmpName
        ,Emp_cnt
        ,case when rne = 1 and c = 3
                then 'Y'
            when rne = 1 and c = 1
                then 'N'
            else ''
            end as condition
from rg;
+---------+---------+-----------+
| EmpName | Emp_cnt | condition |
+---------+---------+-----------+
| Emp1    |      20 | Y         |
| Emp1    |      20 |           |
| Emp1    |      20 |           |
| Emp2    |      20 | N         |
| Emp2    |      21 |           |
| Emp2    |      22 |           |
| Emp3    |      20 | N         |
| Emp3    |      21 |           |
| Emp3    |      21 |           |
+---------+---------+-----------+