SQL 服务器:查找非重复项

SQL Server : find non duplicates

我在 SQL 服务器中有一个 table,如下所示:

id   filename   size
---------------------
1    abc.aaa    0
2    abc.zip    123
3    def.aaa    0
4    def.zip    124
5    ghi.zip    123
6    jkl.aaa    0
7    jkl.zip    124
8    mno.zip    234
9    pqr.aaa    0
10   pqr.zip    345

我需要找到具有唯一文件名 "without" 扩展名的行。

所以结果应该是

id   filename   size
---------------------
4    def.zip    124
8    mno.zip    234

我试过使用

select distinct (Left(filename, LEN(filename) - 4 
from tbl 

但是 returns abc, def, ghi, jkl 等等...

我怎样才能得到我想要的结果?

也许这会给出您正在寻找的答案:

select id
       , filename
       , size 
from (
     select max(id) id
            , max(filename) filename 
            , max(size) size
            , Left(filename, LEN(filename) - 4) file_name
            , count(Left(filename, LEN(filename) - 4)) count_column
     from testTable 
     group by Left(filename, LEN(filename) - 4)
     having count(Left(filename, LEN(filename) - 4)) = 1) as t1;

这是DEMO

NOT EXISTS:

select t.* from tablename t
where not exists (
  select 1 from tablename
  where id <> t.id 
  and left(filename, charindex('.', filename)) = left(t.filename, charindex('.', t.filename))  
)

COUNT()window函数:

select t.id, t.filename, t.size
from (
  select *, count(1) over (partition by left(filename, charindex('.', filename))) counter
  from tablename
) t
where t.counter = 1

参见demo
结果:

> id | filename | size
> -: | :------- | ---:
>  5 | ghi.zip  |  123
>  8 | mno.zip  |  234

如果 预期结果不正确,一种方法是使用 CTE 和 COUNT:

WITH CTE AS(
    SELECT id,
           [filename],
           size,
           COUNT(id) OVER (PARTITION BY LEFT([filename],NULLIF(CHARINDEX('.',[filename]),0))) AS [Count]
    FROM YourTable)
SELECT id,
       [filename],
       size 
FROM CTE
WHERE [Count] = 1;

使用 Forpas 的示例数据:DB<>Fiddle