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

2024-01-02

我有一个包含一些记录的临时表。

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 有没有办法可以解决这个问题?


我猜您想显示一组列的不同行中的 per_id 是否有不同的值。您可以使用窗口函数MIN and MAX检查同一 per_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;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SQL Server 中的 Case 语句用于识别可能的重复项 的相关文章

  • 使用 IP 地址和端口号访问 SQL Server ... 求助!

    我需要访问位于防火墙后面的计算机上的 SQL Server 并且您使用像 95 95 95 33 6930 这样的 IP 地址 不是真实的 IP 地址 来访问这台计算机 但是 通过访问 95 95 您会明白我的观点 95 33 在端口 69
  • 附加数据库时出现权限错误:“无法访问指定路径”

    我正在运行 SQL Server 2012 企业版 我已经下载了 AdventureWorks 2012 OLTP 数据文件 都 mdf and ldf 我将它们保存到我创建的 AW 文件夹中My Documents我解压文件的地方 我转到
  • 列出 pandas.read_sql 中的 sql 表

    我想打开一个 SQL 2005 数据库 文件扩展名为 mdf 我一直在尝试这样做 import pandas as pd import pyodbc server server name db database name conn pyod
  • 如何根据条件选择列?

    我有一个名为 status 的变量 我在此 select 语句之前设置了它 Select ordr num as num ordr date as date ordr ship with as shipwith From order whe
  • Power Query 根据 Excel 列列表过滤 SQL 视图

    有没有办法使用 Power Query 根据 Excel 表列中的值列表过滤 SQL 视图 我有一个返回大量数据 数百万条记录或属性 的 SQL 视图 用户希望根据属性 ID 的 Excel 表格列进行过滤 我知道我可以根据 Power 查
  • SQL Server 2005 中的分层查询

    早在我在 Oracle 商店工作时 我就认为 CONNECT BY 是理所当然的 现在我一直在使用 SQL Server 2005 并且有一些令人讨厌的对象层次结构 具体来说 我们有一个自引用表 其中所有子记录都有一个包含其父记录 ID 的
  • 当嵌入式键包含 SQL Server 上的标识列时,Hibernate 插入失败

    我正在尝试使用 hibernate 映射实体 但是使用 SQL Server 我无法继续 以下是详细信息 SQL Server 实体 CREATE TABLE dbo BOOK EMBEDDED row id bigint IDENTITY
  • CDC 已启用,但未填充 cdc.dbo_CT 表

    我已使用以下步骤启用 CDC exec sys sp cdc enable db exec sys sp cdc enable table source schema N dbo source name N table name role
  • 对不同记录进行 PIVOT 查询

    我有下表 Id Code percentage name name1 activity 1 Prashant 43 43 James James Running 1 Prashant 70 43 Sam Sam Cooking 1 Pras
  • SQL Server:十进制精度/小数位数产生奇怪的结果

    我正在为一个项目编写一些 SQL 我注意到 SQL Server 中一些看似奇怪的行为 涉及除以小数时的答案 以下是一些示例 说明了我所看到的行为 DECLARE Ratio Decimal 38 16 SET Ratio CAST 210
  • SQL查询获取列的精度值

    我需要一个 SQL 查询来获取某些列的精度值 我主要关心十进制类型列 并且我需要相同的精度值 我意识到在某些版本和数据库服务器供应商中可以这样做 如果您能列出其中的一些 那就太好了 对于 SQL 服务器 select precision f
  • sql查询中where子句中的CASE语句

    我正在尝试在我正在处理的查询的 where 子句中编写一个 case 语句 我正在水晶报告中导入代码 我基本上是想说明变量 类型 是否设置为 创建 以便在where子句中为该日期范围运行 否则为不同的日期范围运行 它一直给我一个错误 我似乎
  • SQL:从单个查询列出多对多

    我有 3 个表 分别代表 Users Roles 和多对多 UsersInRoles 键为 UserId RoleId 相关列 用户名 角色名 在管理 html 应用程序中 我想显示所有用户及其所在角色的列表 我尝试从 SQL 构建一个将返
  • 将记录与另一个表上的最新记录连接

    我正在尝试创建一个 SQL 视图 我如何从一个表中选择最新的记录 而其他记录保持原样 我需要从所有表中选择所有记录 这工作正常 但我需要仅按日期选择最新的提案 这是我遇到的问题 这是我到目前为止所拥有的 SELECT TOP 100 PER
  • 开发和生产 SQL Server 之间使用不同的排序规则会出现哪些问题?

    盘问 无法更新 sys columns 还有其他方法吗 https stackoverflow com questions 4018347 unable to update sys columns any other approach含糊地
  • 如何在 Windows 7 - 64 位中安装 IBM db2 ODBC 驱动程序?

    我需要从本地 SQL Server 2008 R2 连接到远程 DB2 我不想使用链接服务器 因此 我正在搜索下载并尝试安装 IBM DB2 驱动程序 因为主机集成服务器附带的用于 DB2 的 Microsoft ODBC 驱动程序非常昂贵
  • 删除 Sql 服务器中最后一次出现特殊字符之前的子字符串

    我想删除最后一次出现句点之前的子字符串 查询应该转换r k Lee Brown to Lee Brown 所以 基本上我需要最后一个点之前的子字符串 并将其替换为 尝试这个 SELECT RIGHT str CHARINDEX REVERS
  • 使用 sql 查询选择最近 30 天

    我正在查找过去 30 天内周一 周二 周三 周四 周五 周六 周日的数量 我可以在没有实际数据库表的情况下选择最近 30 天的日期和星期几吗 就像是 SELECT everything between convert date GETDAT
  • SQL限制数据库中的最小值和最大值

    CREATE TABLE TBL CD CDnr int identity 1 1 CDTitel nvarchar 80 NOT NULL CDduur int CDprijs smallmoney 所以我正在创建这个表 有什么方法可以将
  • 简单的t-sql而不是触发器

    任何人都可以帮助解决简单的 t sql 脚本与板载触发器的问题吗 我使用非常简单的触发器将数据从一个表复制到另一个表 这些表之间没有关系 当我尝试在触发器创建后 从同一脚本 直接第一次插入数据时 我得到了所需的结果 但所有接下来的尝试都会失

随机推荐