[英]Removing duplicates with Group By
我有与此类似的问题SQL查询中没有重复项
我有这个:
+----------+-----------------+----------+----------+-----------+----------+
| 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.