如何比较基于分区的所有列值与ID

时间:2017-11-22 04:39:10

标签: sql-server sql-server-2014

我有一个案例,其中有相同ID的行,我只是想知道是否有任何方法可以找出给定ID是否包含某些特定值。

表1

ID      Dept      Salary       Flag    Date 
1        IT        5000         N      2017-01-01
1        IT        5000         N      2017-01-02
1        IT        5000         N      2017-01-03
1        IT        5000         N      2017-01-04
1        IT        5000         N      2017-01-05
2        HR        4000         N      2017-01-01
2        HR        4000         N      2017-01-02
2        HR        4000         Y      2017-01-03
2        HR        4000         N      2017-01-04
2        HR        4000         N      2017-01-05
3        Fin       4500         N      2017-01-08
3        Fin       4500         N      2017-01-09
3        Fin       4500         N      2017-01-10
3        Fin       4500         N      2017-01-11
3        Fin       4500         N      2017-01-12
4        Edu       4800         N      2017-02-10
4        Edu       4800         N      2017-02-11
4        Edu       4800         N      2017-02-12
4        Edu       4800         Y      2017-02-13
4        Edu       4800         N      2017-02-14
4        Edu       4800         N      2017-02-15

预期结果:

ID      Dept      Salary       Flag    Date 
1        IT        5000         N      2017-01-01
1        IT        5000         N      2017-01-02
1        IT        5000         N      2017-01-03
1        IT        5000         N      2017-01-04
1        IT        5000         N      2017-01-05

3        Fin       4500         N      2017-01-08
3        Fin       4500         N      2017-01-09
3        Fin       4500         N      2017-01-10
3        Fin       4500         N      2017-01-11
3        Fin       4500         N      2017-01-12

由于IT和Fin没有Y标志,在任何一行中,我只想显示这个结果。有什么方法可以找到这些信息。

5 个答案:

答案 0 :(得分:2)

试试这个

select * from @mytable
where id in (
select 
id from @mytable
group by id
having SUM(case when flag='N' then 1 else 0 end) =COUNT(*))

答案 1 :(得分:1)

您可以使用DENSE_RANK()功能根据列DeptFlag

进行排名
SELECT * FROM <table> WHERE ID IN
(
       SELECT A.ID FROM 
       (
          SELECT *, DENSE_RANK() OVER (order by Dept, Flag) [RN] FROM <table>
       ) A GROUP BY A.ID HAVING COUNT(DISTINCT RN) = 1)

编辑:如果您不想使用DENSE_RANK()功能,您还可以使用简单的case表达式条件

SELECT * FROM <table> WHERE ID IN
(
    SELECT ID FROM <table> GROUP BY ID
    HAVING COUNT(DISTINCT CASE WHEN Flag = 'N' THEN 1 ELSE 0 END) = 1
);

其他简单方法:

SELECT * FROM <table> WHERE ID NOT IN
(
    SELECT DISTINCT ID FROM <table> WHERE FLAG ='Y'
);

结果:

ID  Dept    Salary  Flag        Date
1   IT      5000    N           2017-01-01
1   IT      5000    N           2017-01-02
1   IT      5000    N           2017-01-03
1   IT      5000    N           2017-01-04
1   IT      5000    N           2017-01-05
3   Fin     4500    N           2017-01-08
3   Fin     4500    N           2017-01-09
3   Fin     4500    N           2017-01-10
3   Fin     4500    N           2017-01-11
3   Fin     4500    N           2017-01-12

答案 2 :(得分:1)

我认为这样的样本:

SELECT * FROM table WHERE ID NOT IN
(
    SELECT ID FROM table WHERE FLAG ='Y'
);

答案 3 :(得分:0)

WITH Flaggen AS 
(
select distinct ID
from Table1
where Flag <> 'Y'
)

select * 
from Table1 
join Flaggen 
on Flaggen.Id = Table1.ID

答案 4 :(得分:-1)

嘿@Avi因为你只想显示表中的记录只是使用带有id的where子句然后你会得到预期的输出

select id,Dept,Salary,Flag,Date 
from mytable
where id in (1,3)
希望这可能有所帮助。