【问题标题】:Removing duplicates with Group By使用 Group By 删除重复项
【发布时间】:2014-10-22 16:29:14
【问题描述】:

我有一个类似的问题No duplicates in SQL query

find here the sqlFiddle

我有这个:

+----------+-----------------+----------+----------+-----------+----------+
| TAFIELDA |   DESCRIPTION   | TBFIELDA | TBFIELDB | DOCNUMBER | TCFIELDB |
+----------+-----------------+----------+----------+-----------+----------+
|     1000 | some data       |     2000 |     1000 |       525 |     2000 |
|     1001 | some other data |     2000 |     1001 |       525 |     2000 |
+----------+-----------------+----------+----------+-----------+----------+

预期结果:

+----------+-----------------+----------+----------+-----------+----------+
| TAFIELDA |   DESCRIPTION   | TBFIELDA | TBFIELDB | DOCNUMBER | TCFIELDB |
+----------+-----------------+----------+----------+-----------+----------+
|     1001 | some other data |     2000 |     1001 |       525 |     2000 |
+----------+-----------------+----------+----------+-----------+----------+

我只需要DocNumber = 525 中的最高TAFIELDA 值,所以我这样做了:

SELECT max(tAFieldA) tAFieldA,DocNumber
FROM TABLEA A
INNER JOIN TABLEB B ON A.TAFIELDA = B.TBFIELDB
INNER JOIN TABLEC C ON B.tBFieldA = C.tCFieldB
where DocNumber = 525
group by (DocNumber)

该查询只返回我正在查找的行,问题是如果我添加另一个不能汇总的字段,例如Description,我会再次获得几条记录。

¿我怎样才能在 sample DB 的所有字段中为每个 DocNumber 获取一条记录?

【问题讨论】:

标签: sql sql-server sql-server-2008


【解决方案1】:

使用子查询

SELECT * FROM 
(
SELECT *
      ,ROW_NUMBER() OVER (PARTITION BY DOCNUMBER ORDER BY tAFieldA DESC) rn
FROM TABLEA A
INNER JOIN TABLEB B ON A.TAFIELDA = B.TBFIELDB
INNER JOIN TABLEC C ON B.tBFieldA = C.tCFieldB
) Sub 
WHERE rn = 1

使用 CTE

;WITH CTE
 AS
   (
    SELECT *
          ,ROW_NUMBER() OVER (PARTITION BY DOCNUMBER ORDER BY tAFieldA DESC) rn
    FROM TABLEA A
    INNER JOIN TABLEB B ON A.TAFIELDA = B.TBFIELDB
    INNER JOIN TABLEC C ON B.tBFieldA = C.tCFieldB
   )
 SELECT * FROM CTE
 WHERE rn = 1

Working SQL FIDDLE

【讨论】:

    【解决方案2】:

    使用子查询:

    SELECT *
    FROM TABLEA A
    INNER JOIN TABLEB B ON A.TAFIELDA = B.TBFIELDB
    INNER JOIN TABLEC C ON B.tBFieldA = C.tCFieldB
    WHERE TAFIELDA IN (
      SELECT max(tAFieldA)
        FROM TABLEA A
       INNER JOIN TABLEB B ON A.TAFIELDA = B.TBFIELDB
       INNER JOIN TABLEC C ON B.tBFieldA = C.tCFieldB
       WHERE DocNumber = 525
       GROUP BY (DocNumber)
      )
    

    【讨论】:

      【解决方案3】:
      select a.* ,b.* ,c.* 
      from tablea a
      inner join tableb b on a.tafielda = b.tbfieldb
      inner join tablec c on b.tbfielda = c.tcfieldb
      where (tafielda,docnumber) in
          (
              select max(tafielda) tafielda,docnumber
              from tablea a
              inner join tableb b on a.tafielda = b.tbfieldb
              inner join tablec c on b.tbfielda = c.tcfieldb
              where docnumber = 525
              group by (docnumber)
          )  
      

      【讨论】:

      • 嗨,安迪,你是如何编辑它的,我把格式化的代码放在你编辑的地方,但是发布后,它并没有像现在这样出现,你是怎么做的???
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多