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
我在 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