sql - DB2 和 SQL-如何返回特定字段中的最大值,以便每行只显示一条记录;从多个表中提取数据

标签 sql db2 duplicates max

所有, 下面的数据集从三个单独的表中提取 WONO、EPLSNM 和 SQNO1。我需要的是一个 db2 sql 查询,它将返回每个唯一 WONO 的员工姓名 (EPLSNM),最大 SQNO1。

WONO    EPLSNM               SQNO1
CA04269 WILLIAMS, BILLY W   12
CA04269 WILLIAMS, BILLY W   12
CA04269 WILLIAMS, BILLY W   12
CA04269 WILLIAMS, BILLY W   12
CA04270 FAIRCLOTH, MARK E   22
CA04270 FAIRCLOTH, MARK E   22
CA04270 FAIRCLOTH, MARK E   22
CA04270 FAIRCLOTH, MARK E   22
CA04270 FAIRCLOTH, MARK E   23
CA04270 FAIRCLOTH, MARK E   23
CA04270 FAIRCLOTH, MARK E   23
CA04270 FAIRCLOTH, MARK E   23

如果可能的话,我希望看到以下内容:

WONO    EPLSNM               SQNO1
CA04269 WILLIAMS, BILLY W   12
CA04270 FAIRCLOTH, MARK E       23

我只需要 2 行数据,而我需要 12 行数据。

非常感谢。

这是我的代码:

    SELECT DISTINCT WOHDR.wono,EMP.eplsnm,max(WOLBR.sqno1) AS SQNO,WOLBR.cgcd,CASE WHEN WOHDR.opndt8 IN (' ') THEN DATE('1900-01-01') WHEN WOHDR.opndt8 IS NULL THEN DATE('1900-01-01') ELSE Date(Cast(SUBSTRING(WOHDR.opndt8,1,4) as char(4)) ||'-'|| Cast(SUBSTRING(WOHDR.opndt8,5,2) as char(2)) ||'-'|| Cast(SUBSTRING(WOHDR.opndt8,7,2) as char(2))) END AS OpenDate,CASE WHEN WOHDR.prmdt8 IN (' ') THEN DATE('1900-01-01') WHEN WOHDR.prmdt8 IS NULL THEN DATE('1900-01-01') ELSE Date(Cast(SUBSTRING(WOHDR.prmdt8,1,4) as char(4)) ||'-'|| Cast(SUBSTRING(WOHDR.prmdt8,5,2) as char(2)) ||'-'|| Cast(SUBSTRING(WOHDR.prmdt8,7,2) as char(2))) END AS PromisedDate,WOHDR.divi AS Division, WOHDR.cunm AS CustName, WOHDR.eqmfmd AS Model,WOHDR.stno AS StoreNo,RPT.ds5 AS StoreName,WOHDR.acti

FROM libd09.wophdrs0 WOHDR 
JOIN libd09.wopsegs0 WOSEG ON (WOHDR.wono = WOSEG.wono)
JOIN libd09.fnlrlvl0 RPT ON (WOHDR.stno = RPT.st4 AND WOHDR.stno = WOSEG.stn1)
LEFT JOIN libd09.cipname0 NME ON (NME.cuno = WOHDR.cuno)
LEFT JOIN libd09.woplabr0 WOLBR ON (WOHDR.wono = WOLBR.wono)
LEFT JOIN libd09.wopempf0 EMP ON (EMP.epidno = WOLBR.epidno AND WOHDR.stno = EMP.stn1)
WHERE WOHDR.opndt8 BETWEEN 20130101 AND YEAR(CURRENT DATE) * 10000 + MONTH(CURRENT DATE) * 100 + DAY(CURRENT DATE) 
AND WOHDR.divi = 'G'
AND NME.cuno NOT LIKE ('I%')
AND RPT.rplvl = ' ' 
AND WOHDR.cunm NOT IN ('ACCRUED VACATION TIME','ACCRUED VACATION','SICK TIME','SICK PAY')
AND WOHDR.acti IN ('O','C')
-- AND DATE(Cast(SUBSTRING(WOLBR.docdt8,1,4) as char(4)) ||'-'|| Cast(SUBSTRING(WOLBR.docdt8,5,2) as char(2)) ||'-'|| Cast(SUBSTRING(WOLBR.docdt8,7,2) as char(2))) = DATE(RTRIM(CHAR(WOHDR.llbjd8)))

GROUP BY
WOHDR.wono,EMP.eplsnm,WOLBR.cgcd,WOHDR.opndt8,WOHDR.divi,WOHDR.cunm, WOHDR.eqmfmd,WOSEG.wosgno,WOHDR.stno,WOHDR.prmdt8,RPT.ds5,WOHDR.acti

最佳答案

您可以将其作为聚合查询来执行:

SELECT WONO, EPLSNM, MAX(SQNO1)
FROM whatever w
GROUP BY WONO, EPLSNM;

编辑:

(基于评论中的澄清)

您可以使用窗口/分析函数:

select wono, eplsnm, sqn01
from (select w.*, row_number() over (partition by wono order by sqno1 desc) as seqnum
      from whatever w
     ) w
where seqnum = 1;

关于sql - DB2 和 SQL-如何返回特定字段中的最大值,以便每行只显示一条记录;从多个表中提取数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22490829/

相关文章:

java - 加速 Java 应用程序

mysql - 如何在使用 where 子句时仅查找一列中的重复值?

python - 如何使用 Python 测试唯一字符串和重复字符串(不同大小写)

mysql - 选择特定列具有最高值的行

sql - Bigquery regexp_replace 错误 (\? vs\\?)

php - 无法连接到 iSeries odbc

java - 在java中读取XML数据库列

SQL检索最新记录,按唯一外键分组

python - 操作参数在sql/python中必须是str

mysql - 如何确定一行在有序 SQL 表中的位置?