sql - SQL 提取不同的值并创建 ID
问题描述
我有这个查询:
select
p.[PersonID],
d.[DeviceID],
'DeviceID' + convert(char, ROW_NUMBER() over(partition by p.PersonID order by d.DeviceID)) as 'key'
from People p
inner join Devices d
on p.PersonID = d.PersonID
where d.DeviceID is not null
从这些表中:
PersonID | Name
---------------
1 Jim
2 Bob
DeviceID | PersonID
-------------------
40 1
40 1
70 2
90 2
给了我这些结果:
PersonID | DeviceID | key
--------------------------------
1 40 DeviceID1
1 40 DeviceID2
2 70 DeviceID1
2 90 DeviceID2
但实际上,因为PersonID
1 有DeviceID
40 两次,所以我只需要这个:
PersonID | DeviceID | key
--------------------------------
1 40 DeviceID1
2 70 DeviceID1
2 90 DeviceID2
我尝试将 DISTINCT 添加到我的查询中,但它在第一部分不起作用,我不确定如何partition
在位中应用它......
非常感谢任何帮助!
解决方案
使用dense_rank()
:
select distinct p.[PersonID], d.[DeviceID],
concat('DeviceID', dense_rank() over (partition by p.PersonID order by d.DeviceID)) as [key]
from People p join
Devices d
on p.PersonID = d.PersonID
where d.DeviceID is not null;
请注意,我还将代码更改为使用concat()
而不是+
. 您转换为字符串充满了危险,因为您没有在转换中包含长度。在 SQL Server 中,默认长度因上下文而异。在这种情况下,省略长度可能会起作用。但如果你有这样做的习惯,它现在可能适用于另一种情况。
此外,仅对字符串和日期常量使用单引号。 key
因为它是 SQL 关键字,所以对于列来说是一个坏名称。如果确实使用它,请使用方括号或双引号。
推荐阅读
- google-apps-script - 如何使用 Google Apps 脚本在“Google Slide”中合并 2 个表格单元格
- javascript - 如何删除 Chart.js 中的标题颜色框
- javascript - JQuery:.find() 定位某些元素,但不定位其他元素
- android - 错误:在包“android”中找不到属性“appComponentFactory”的资源标识符
- python - Seaborn 分组箱线图 - 在每组对上方显示 P 值
- mocha.js - Mocha 重试不适用于 should.js 进行异步调用
- reactjs - useEffect 中的状态更新
- python - 无法将熊猫数据框写入配置单元表
- python - 使用 while 和 for 循环在 Python 中创建猜谜游戏
- android - 使用纹理的 3D 模型 [Android]