繁体   English   中英

使用分组依据删除重复项

[英]Removing duplicates with Group By

我有与此类似的问题SQL查询中没有重复项

在这里找到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 ,我又得到了几条记录。

¿我如何才能获得每个DocNumber以及示例数据库的所有字段的一条记录?

使用子查询

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

使用子查询:

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)
  )
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)
    )  

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM