Sql 查找具有重复列但与具有指定值的一列不同的行

Sql 查找具有重复列但与具有指定值的一列不同的行,sql,sql-server,Sql,Sql Server,我有以下数据: ID PERSNR YEARNR MONTHNR DAYNR ABSTIME ABSID ABSCALC TypeLine --------------------------------------------------------------------- 1 26 2018 12 3 480 3 11 0 2 26 2018 12 3 480

我有以下数据:

ID  PERSNR  YEARNR  MONTHNR DAYNR   ABSTIME ABSID   ABSCALC TypeLine
---------------------------------------------------------------------
 1  26      2018    12      3       480     3       11      0
 2  26      2018    12      3       480     3       11      1
 5  26      2018    10      1        60     1       31      0
 8  26      2018    10      3        60     1       31      0
13  69      2018    12      3       480     3       11      0
14  69      2018    12      3       480     3       11      1
19  69      2018     9      3        60     3       31      1
22  69      2018     9      3        60     3       31      0
23  69      2018     9      3       420    21       11      0
26  69      2018     9      6       120    21       31      1
29  69      2018     9     10       120    21       31      1
32  69      2018     9      4       480    21       11      1
我需要确定以下情况:

同时具有类型行0和1的行 结果Id:1和2;13和14、19和22

只有TypeLine的行只有0 结果Id为:5;8.二十三

只有TypeLine的行只有1 结果Id:26、29、32

我不确定是否要创建这3个脚本,也找不到解决方案


你能帮帮我吗?

这是你想要的吗

select (case when cnt_type_0 > 0 and cnt_type_1 > 0
             then 'Condition 1'
             when cnt_type_1 = 0
             then 'Condition 2'
             when cnt_type_0 = 0
             then 'Condition 3'
        end) as condition,
       t.*
from (select t.*,
             count(*) over (partition by ID, PERSNR, YEARNR, MONTHNR, DAYNR, ABSTIME, ABSID, ABSCALC) as cnt,
             sum(case when TypeLine = 0 then 1 else 0 end) over (partition by ID, PERSNR, YEARNR, MONTHNR, DAYNR, ABSTIME, ABSID, ABSCALC) as cnt_type_0,             
             sum(case when TypeLine = 1 then 1 else 0 end) over (partition by ID, PERSNR, YEARNR, MONTHNR, DAYNR, ABSTIME, ABSID, ABSCALC) as cnt_type_1
       from t
      ) t
where cnt >= 2;

您可以将条件添加到WHERE子句中,以仅获取一种类型的行。

尝试以下操作:

SELECT DISTINCT ID, 
PERSNR, 
YEARNR, 
MONTHNR, 
DAYNR, 
ABSTIME, 
ABSID, 
ABSCALC, 
iif(count(TypeLine) >= 2, 'duplicate', iif(min(TypeLine) = 1, '1', '0')) as status
FROM table
GROUP BY ID, PERSNR, YEARNR, MONTHNR, DAYNR, ABSTIME, ABSID, ABSCALC

假设源数据正确,您可以运行以下3个查询。1当前回答正确,但2和3在问题的当前版本中有不同的DAYNUM,因此您不会使用这些示例值返回任何内容

--1
SELECT T1.ID AS [T1_ID], T2.ID AS [T2_ID]
  FROM [tablename] T1 INNER JOIN [tablename] T2 ON T1.PERSNR = T2.PERSNR 
  AND T1.YEARNR = T2.YEARNR AND T1.MONTHNR = T2.MONTHNR
  AND T1.DAYNR = T2.DAYNR AND T1.ABSTIME = T2.ABSTIME
  AND T1.ABSID = T2.ABSID AND T1.ABSCALT = T2.ABSCALT
  AND (T1.TypeLine = 0 AND T2.TypeLine = 1
       OR
       T1.TypeLine = 1 AND T2.TypeLine = 0
      )
  AND T1.ID < T2.ID

--2
SELECT T1.ID AS [T1_ID], T2.ID AS [T2_ID]
  FROM [tablename] T1 INNER JOIN [tablename] T2 ON T1.PERSNR = T2.PERSNR 
  AND T1.YEARNR = T2.YEARNR AND T1.MONTHNR = T2.MONTHNR
  AND T1.DAYNR = T2.DAYNR AND T1.ABSTIME = T2.ABSTIME
  AND T1.ABSID = T2.ABSID AND T1.ABSCALT = T2.ABSCALT
  AND T1.TypeLine = 0 AND T2.TypeLine = 0
  AND T1.ID < T2.ID

--3 
SELECT T1.ID AS [T1_ID], T2.ID AS [T2_ID]
  FROM [tablename] T1 INNER JOIN [tablename] T2 ON T1.PERSNR = T2.PERSNR 
  AND T1.YEARNR = T2.YEARNR AND T1.MONTHNR = T2.MONTHNR
  AND T1.DAYNR = T2.DAYNR AND T1.ABSTIME = T2.ABSTIME
  AND T1.ABSID = T2.ABSID AND T1.ABSCALT = T2.ABSCALT
  AND T1.TypeLine = 1 AND T2.TypeLine = 1       
  AND T1.ID < T2.ID

请以表格格式显示所需的结果。ID 23的重复行在哪里?我的意思是:你什么时候认为一条线是复制的?你会看到哪些列?我在Purnr、Aythnr、Munthnr、Daynr、AbStudio、absid和abcCurc列之后考虑重复行。我需要确定何时是类型为0和1的两行。对于2:第5行和第8行不是重复的行。DAYNR是不同的。同样的事情发生在3:DAYNR上,但情况不同。我更正了帖子。是关于部分重复的行。抱歉,没有。正如我所说的,我需要3个不同的表和不同的行。如果两个TypeLine都有0和1,则排除只有一个TypeLine的行。在您的脚本中,决不会出现条件1…@MarinaGratielaStan。然后将条件放入答案中提到的WHERE子句中,并使用SELECT INTO或INSERT,没有返回我所期望的:条件ID PERSNR earger MONTHNR DAYNR absime ABSID ABSSTATUS ABSCALC cnt cnt_type_0 cnt_type_1条件2 1 26 2018 12 3 480 3 000010011 1 0条件3 26 2018 12 3 480 3 000010011 1 0条件2 5 26 2018 10 1 60 1 100000000 31 1 0条件2 8 26 2018 10 3 60 1 100000000 31 1 0条件2 13 69 2018 12 3 480 3 000010011 1 1 0条件3 14 69 2018 12 3 480 3 000010011 1 0 1条件3 19 69 2018 9 3 60 3 100000000 31 1 0 1条件2 22 69 2018 9 3 60 3 100000000 31 1 1 0我需要先选择。最后一个不会返回结果。。。但是我可以通过首先选择并使用一个简单的条件使用剩余的行来消除基于的行。谢谢你的帮助:这不是我需要的。