SQL Server: найти не дубликаты - PullRequest
0 голосов
/ 27 октября 2019

У меня есть таблица в SQL Server, которая выглядит следующим образом:

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

Мне нужно найти строки с уникальным именем файла «без» расширения.

Итак, результатдолжно быть

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

Я пытался использовать

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

, но это возвращает abc, def, ghi, jkl и т.д ...

Как я могу получить желаемый результат?

Ответы [ 3 ]

3 голосов
/ 27 октября 2019

С 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() оконной функцией:

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

См. Демонстрационную версию . Результаты:

> id | filename | size
> -: | :------- | ---:
>  5 | ghi.zip  |  123
>  8 | mno.zip  |  234
0 голосов
/ 27 октября 2019

Если ожидаемые результаты неверны, то один путь будет с 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

0 голосов
/ 27 октября 2019

Может быть, это даст ответ на то, что вы ищете:

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

...