【问题标题】:SQL Server : find non duplicatesSQL Server:查找不重复项
【发布时间】:2019-10-27 09:25:40
【问题描述】:

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

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

【问题讨论】:

  • 为什么预期的结果不包含id = 5 行?
  • 为什么结果中有 id = 4 的行?因为有'def.zip'和'def.aaa'?
  • 抱歉,ghi.zip 和 mno.zip 是我所追求的独特价值。

标签: sql sql-server unique distinct


【解决方案1】:

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

请参阅demo
结果:

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

【讨论】:

    【解决方案2】:

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

    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

    【讨论】:

      【解决方案3】:

      如果预期结果不正确,一种方法是使用 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

      【讨论】:

        猜你喜欢
        • 2016-09-29
        • 1970-01-01
        • 1970-01-01
        • 2023-03-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多