SQLite - 返回列包含重复子字符串的行

问题描述 投票:0回答:1

我们的工作站命名约定以设备的序列号结尾。我正在尝试获取 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

但我无法弄清楚如何返回存在重复序列的主机名的整个列表。

我将非常感谢您的帮助!

谢谢!

sqlite duplicates
1个回答
0
投票

一种简单的方法是利用

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;

导致:-

© www.soinside.com 2019 - 2024. All rights reserved.