我们的工作站命名约定以设备的序列号结尾。我正在尝试获取 SQLite 数据库中已重命名/重新映像且现在已复制的工作站列表,以便可以删除旧设备。有时,重新映像的设备将具有与之前相同的名称。关键是序列号相同。我的 SQL 技能无法胜任这项任务,而且我只发现了类似的问题,但这些问题并不能完全满足我的需要。
示例数据(序列号是字母和数字的随机字符串,但长度始终相同。 - 始终位于相同位置)
资产
主机名 | 最后看到 |
---|---|
usera-serial042 | 2023/09/22 |
usera-serial042 | 2023/10/29 |
用户c-serial222 | 2023/10/29 |
userd-serial312 | 2023/10/30 |
userre-serial312 | 2023/10/11 |
userf-serial822 | 2023/10/11 |
用户g-serial219 | 2023/10/11 |
我希望结果是
usera-serial042 2023/09/22
usera-serial042 2023/10/29
userd-serial312 2023/10/30
usere-serial312 2023/10/11
我可以使用以下方法提取序列号:
SUBSTR(hostname, (INSTR(hostname, '-')+1), (LENGTH(hostname)-INSTR(hostname, '-')))
我可以使用
获取所有重复序列号的列表select SUBSTR(hostname, (INSTR(hostname, '-')+1), (LENGTH(hostname)-INSTR(hostname, '-'))) as serial, count(*)
from assets
group by serial
having count(*) > 1
但我无法弄清楚如何返回存在重复序列的主机名的整个列表。
我将非常感谢您的帮助!
谢谢!
group_concat
聚合函数,它可以提供主机名的 CSV(如果需要,还可以提供 Lastseen 的主机名)
例如
select SUBSTR(hostname, (INSTR(hostname, '-')+1), (LENGTH(hostname)-INSTR(hostname, '-'))) as serial, count(*)
,group_concat(hostname) AS serial_csv
/* lastseens delimited with ~ */
, group_concat(lastseen,'~') AS dlm_lastseenlist
from assets
group by serial
having count(*) > 1;
演示(用附加数据显示第三个,有 3 个重复项):-
/* just in case Cleanup */
DROP TABLE IF EXISTS assets;
CREATE TABLE IF NOT EXISTS assets (hostname TEXT, lastseen TEXT);
INSERT INTO assets VALUES
('usera-serial042','2023/09/22')
,('usera-serial042','2023/10/29')
,('userc-serial222','2023/10/29')
,('userd-serial312','2023/10/30')
,('usere-serial312','2023/10/11')
,('userf-serial822','2023/10/11')
,('userg-serial219','2023/10/11')
/* added for demo */
,('userx-serial111','2023/10/01')
,('userxy-serial111','2023/10/11')
,('userz-serial111','2023/10/21')
;
select SUBSTR(hostname, (INSTR(hostname, '-')+1), (LENGTH(hostname)-INSTR(hostname, '-'))) as serial, count(*)
,group_concat(hostname) AS serial_csv
/* lastseens delimited with ~ */
, group_concat(lastseen,'~') AS dlm_lastseenlist
from assets
group by serial
having count(*) > 1;
/* Cleanup Demo environment */
DROP TABLE IF EXISTS assets;
导致:-