【问题标题】:Get Max Value per ID column获取每个 ID 列的最大值
【发布时间】:2018-04-05 02:48:50
【问题描述】:

在下面的查询中,我希望获取每个 USERID 的 SEQNBR 字段的 MAX 值,其中 USERID 没有 STATUS 值为“CLE”的行。

我能够检索每个 USERID 的 MAX SEQNBR Row,但它不排除 USERID 在表中有一行值为“CLE”的情况下。

由于查询最终将运行的环境中的限制,我想避免在 SELECT 子句中使用公用表表达式 (CTE) 和子查询。

SELECT A.USERID, (CONVERT(CHAR(10),A.TEST_DT,121))AS 'TEST_DATE', A.TYPE_CD, 
 (CONVERT(CHAR(10),A.NEXT_TEST_DT,121))AS 'EXPIRE_DATE', B.STATUS1, 
 B.MGR_CLR, B.COMMENT, C.COMPANY, D.DESCR, E.DESCR, 
 F.LAST_NAME, F.FIRST_NAME, B.SEQNBR 
FROM ((((((TEST_PLACEMENT A 
LEFT OUTER JOIN  TEST_STATUS B ON  B.USERID = A.USERID AND B.TEST_DT 
= A.TEST_DT ) 
LEFT OUTER JOIN  (PS_JOB C INNER JOIN PS_EMPLMT_SRCH_QRY C1 ON (C.USERID = 
C1.USERID AND C.EMPL_RCD = C1.EMPL_RCD )) ON  
C.USERID = A.USERID ) 
LEFT OUTER JOIN  PS_JOBCODE_TBL D ON  D.JOBCODE = C.JOBCODE ) 
LEFT OUTER JOIN  PS_DEPARTMENT_VW E ON  E.DEPTID = C.DEPTID ) 
LEFT OUTER JOIN  (PS_JOB G INNER JOIN PS_EMPLMT_SRCH_QRY G1 ON (G.USERID = 
 G1.USERID AND G.EMPL_RCD = G1.EMPL_RCD )) ON  
 G.POSITION_NBR = C.REPORTS_TO AND G.EFFDT = (SELECT MAX( H.EFFDT) 
 FROM PS_JOB H, PS_EMPLMT_SRCH_QRY H1 
 WHERE H.USERID = H1.USERID 
 AND H.EMPL_RCD = H1.EMPL_RCD 
 AND ( G.POSITION_NBR = H.POSITION_NBR )) ) 
LEFT OUTER JOIN  (PS_NAMES F INNER JOIN PS_PERALL_SEC_QRY F1 ON (F.USERID = 
F1.USERID )) ON  F.USERID = A.USERID ) 
WHERE ( ( 
 C.JOB_INDICATOR = 'P' 
 AND B.SEQNBR = 
  (SELECT MAX(BB.SEQNBR) FROM TEST_STATUS BB
   WHERE  BB.USERID = B.USERID AND BB.STATUS1 <> 'CLE')
   --GROUP BY BB.STATUS1)
 AND G.EFFSEQ = 
    (SELECT MAX(G_ES.EFFSEQ) FROM PS_JOB G_ES 
    WHERE G.USERID = G_ES.USERID 
      AND G.EMPL_RCD = G_ES.EMPL_RCD 
      AND G.EFFDT = G_ES.EFFDT) )))

有问题的代码是:

  (AND B.SEQNBR = 
  (SELECT MAX(BB.SEQNBR) FROM TEST_STATUS BB
  WHERE  BB.USERID = B.USERID AND BB.STATUS1 <> 'CLE')
  --GROUP BY BB.STATUS1)) 

这是现在主查询中的示例数据:

以下是期望的结果(基于上面的原始示例):

如您所见,USERID 的 1 和 3 已被删除,因为它们每个都有一个具有“CLE”状态的行,并且 USERID 5 的 SEQNBR 37 的行被删除,因为它不是该 USERID 的 MAX SEQNBR (SEQNBR 38 用于 USERID 5)。

【问题讨论】:

    标签: sql sql-server-2012


    【解决方案1】:

    你需要测试所有行

    SELECT MAX(BB.SEQNBR) 
    FROM TEST_STATUS BB
    WHERE BB.USERID = B.USERID 
      and not exists (select 1 
                      from TEST_STATUS cc 
                      where ccUSERID = BB.USERID 
                      AND cc.STATUS1 = 'CLE')
    

    【讨论】:

    • 这在 SQL 管理器中效果很好并提供了预期的结果,但是我希望从中运行的工具不能包含第二级子查询。对于构建它还有其他想法吗?
    • 你根本不能运行子查询?可以使用临时表吗?
    【解决方案2】:
    And b.seqnbr=(Select max(bb.seqnbr) from     TEST_STATUS bb
    Where bb.user_id not in (
    Select t2.user_id from TEST_STATUS t2 where t2.status='CLE'
    )
    and bb.user_id=b.user_id
    Group by bb.user_id)
    

    【讨论】:

    • 请尝试在您的答案中添加解释,以便其他人了解它的工作原理和原因。
    猜你喜欢
    • 2017-06-11
    • 1970-01-01
    • 1970-01-01
    • 2010-10-19
    • 1970-01-01
    • 2020-03-22
    • 2021-07-20
    • 2021-09-15
    • 1970-01-01
    相关资源
    最近更新 更多