Sql server SQL Server中的Case语句,用于识别可能的重复项

Sql server SQL Server中的Case语句,用于识别可能的重复项,sql-server,Sql Server,我有一张临时表,上面有一些记录 CREATE TABLE #TEMP ( PER_ID INT, PER_SS VARCHAR (11), PER_MISC VARCHAR (25), PER_CLASS VARCHAR (20), FILE_DT DATETIME, PER_CASE_ID INT, PER_CODE VARCHAR (5), CREATE_DT DATETIME, END_DT DATETIME ) INSERT INTO #TEMP VALUES('9801745','

我有一张临时表,上面有一些记录

CREATE TABLE #TEMP
(
PER_ID INT,
PER_SS VARCHAR (11),
PER_MISC VARCHAR (25),
PER_CLASS VARCHAR (20),
FILE_DT DATETIME,
PER_CASE_ID INT,
PER_CODE VARCHAR (5),
CREATE_DT DATETIME,
END_DT DATETIME

)

INSERT INTO #TEMP VALUES('9801745','6385789','21 ADC 846/841(T)(1)(B)','NMT785989','11/11/2016 12:00 AM','957800','IDA','11/12/2016 11:00 PM','11/17/2016 12:00 AM')
INSERT INTO #TEMP VALUES('9801745','6385789','21 B 1325(Q)(4)','NMT785989','11/11/2016 12:00 AM','957800','CAN','11/12/2016 11:00 PM','11/21/2016 12:00 AM')
INSERT INTO #TEMP VALUES('9801745','6385789','21 B 1325(Q)(4)','NMT785989','11/11/2016 12:00 AM','698080','QBC','11/12/2016 11:00 PM','11/21/2016 12:00 AM')
INSERT INTO #TEMP VALUES('9801745','6385789','88 EEA 1326 (K)(1)','NMT785989','11/11/2016 12:00 AM','957800','CAN','11/12/2016 12:15 PM','')
INSERT INTO #TEMP VALUES('9801745','6385789','88 EEA 1326 (K)(1)','NMT785989','11/11/2016 12:00 AM','698080','DLC','11/12/2016 12:15 PM','')
我正在尝试使用SQL Server中的case语句,通过创建几个额外字段(如下面的结果)来识别可能的重复记录:

same per id same per ss same per misc   same per class  same file date  per id  per ss  per misc    per  class  file date   per case id per code    create date end date
yes yes no  yes yes 9801745 6385789 21 ADC 846/841(T)(1)(B) NMT785989   11/11/2016  957800  IDA 11/12/2016  11/17/2016
yes yes yes yes yes 9801745 6385789 21 B 1325(Q)(4) NMT785989   11/11/2016  957800  CAN 11/12/2016  11/21/2016
yes yes yes yes yes 9801745 6385789 21 B 1325(Q)(4) NMT785989   11/11/2016  698080  QBC 11/12/2016  11/21/2016
yes yes yes yes yes 9801745 6385789 88 EEA 1326 (K)(1)  NMT785989   11/11/2016  957800  CAN 11/12/2016  
yes yes yes yes yes 9801745 6385789 88 EEA 1326 (K)(1)  NMT785989   11/11/2016  698080  DLC 11/12/2016  
基本上,如果每个id列相同,则为每个id列提供相同的“是”,如果每个ss列相同,则为每个ss提供相同的“是”,依此类推。我已尝试使用SQL Server代码,如下所示:

SELECT DISTINCT
CASE 
WHEN A.PER_ID = B.PER_ID THEN 'YES' ELSE 'NO' END AS SAME_PER_ID,

CASE 
WHEN A.PER_SS = B.PER_SS THEN 'YES' ELSE 'NO' END AS SAME_PER_SS,

CASE 
WHEN A.PER_MISC = B.PER_MISC THEN 'YES' ELSE 'NO' END AS SAME_PER_MISC,

CASE 
WHEN A.PER_CLASS = B.PER_CLASS THEN 'YES' ELSE 'NO' END AS SAME_PER_CLASS,

CASE 
WHEN A.FILE_DT = B.FILE_DT THEN 'YES' ELSE 'NO' END AS SAME_FILE_DT,
A.PER_ID, 
A.PER_SS, 
A.PER_MISC,
A.PER_CASE_ID,
A.PER_CLASS,
A.FILE_DT,
A.CREATE_DT,
A.END_DT
FROM #TEMP A INNER JOIN #TEMP B
ON A.PER_ID = B.PER_ID
ORDER BY A.PER_ID, A.PER_CASE_ID

但是,我返回了10条记录,而不是5条记录,结果并不是我所期望的。SQL Server中有什么方法可以解决这个问题吗?

也许您可以尝试从表到表本身进行内部连接。比如:

从T1.PER_SS=T2.PER_SS和T1.PER_ID=T2.PER_ID上的温度T1内部连接温度T2中选择*等

你也可以试试这样的


从TEMP T1、TEMP T2中选择T1.*其中T1.PER_SS=T2.PER_SS和T1.PER_ID=T2.PER_ID-等等。

我猜您想显示一组列的不同行中的PER_ID是否有不同的值。您可以使用窗口函数MIN和MAX检查同一PERU id的不同列中是否有多个不同的值

select 
    t.*,
    case when max(PER_SS) over (partition by per_id) = min(PER_SS) over (partition by per_id) then 'Yes' else 'No' end as same_per_ss,
    case when max(PER_MISC) over (partition by per_id) = min(PER_MISC) over (partition by per_id) then 'Yes' else 'No' end as same_per_misc,
    case when max(PER_CLASS) over (partition by per_id) = min(PER_CLASS) over (partition by per_id) then 'Yes' else 'No' end as same_per_class,
    case when max(FILE_DT) over (partition by per_id) = min(FILE_DT) over (partition by per_id) then 'Yes' else 'No' end as same_per_file_dt
from #temp t;

他们在发布的查询中有一个内部联接。您的第二个查询只是内部联接的过时语法。您能分享您期望的输出吗?在给出以下答案后,这个问题被重写为一个新问题。我已经返回到原始版本,然后整理了那个版本。在提供答案后,请不要对问题进行实质性修改-答案应该来自于问题,以利于未来读者。@Gurvinder Singh,我已经编辑了我的样本数据,并解释了我遇到的下一个问题。谢谢你的帮助。Joe@Joe-不要在一个问题中问多个问题。请提出一个新问题。好的,先生