Sql 需要将查询中的结果限制为某列中的最大值

Sql 需要将查询中的结果限制为某列中的最大值,sql,db2,Sql,Db2,下面的查询为我提供了所需的所有信息。然而,由于修订级别,我得到了多个结果。大多数结果集的第一个也是唯一一个修订版返回空白。如果一个报价已经被修改,它将被指定为修订版a。如果它再次被修改,它将得到B。我将得到空白、a、B等的结果。我想将查询限制为仅在不为空白时才看到最大值 SELECT RTRIM(CUST_REF_NUMBER) AS "PICKUP #" ,RTRIM(SN.NUMBER) AS "NUMBER" ,DATE(PICKUP_TSTAMP) AS "PICKUP DATE" ,

下面的查询为我提供了所需的所有信息。然而,由于修订级别,我得到了多个结果。大多数结果集的第一个也是唯一一个修订版返回空白。如果一个报价已经被修改,它将被指定为修订版a。如果它再次被修改,它将得到B。我将得到空白、a、B等的结果。我想将查询限制为仅在不为空白时才看到最大值

SELECT
 RTRIM(CUST_REF_NUMBER) AS "PICKUP #"
,RTRIM(SN.NUMBER) AS "NUMBER"
,DATE(PICKUP_TSTAMP) AS "PICKUP DATE"
,B.DUE_DATE
,WEIGHT
,TOTAL_PIECES AS "PIECES"
,V.QUOTE_ID AS "QUOTE"
,EQUIP AS "ACTUAL QUOTE PRICE"
,TOTAL_CHG AS "CHARGES"
,B.CUST AS "ACCOUNT NUMBER"
,C.ACCT_SPELLING AS "ACCOUNT NAME"
,H.REVISION

FROM AF.NOTIF SN
INNER JOIN AF.BILL B
ON SN.NUMBER = B.NUMBER
AND B.ARCHIVE_KEY = ''
AND B.CORRECTED = ''
AND B.TSTAMP >= SN.TSTAMP - 10 DAYS
INNER JOIN AF.PROS V
ON SN.NUMBER = V.NUMBER
INNER JOIN AF.CHARGES H
ON V.QUOTE_ID = H.QUOTE_ID
AND H.STATUS = 'X'
LEFT OUTER JOIN AF.SPELLING C
ON B.CUST = C.ACCT_NUM
AND C.TYPE = 'M'

WHERE WEB_ID IN ('XXXXXXX','XXXXXXX','XXXXXXX')
AND SN.TSTAMP > TIMESTAMP(CHAR(CURRENT DATE - 7 DAYS)||'-00.00.00.000000')
ORDER BY PICKUP_TSTAMP

类似这样的情况可能是:

SELECT * FROM (
    SELECT
     RTRIM(CUST_REF_NUMBER) AS "PICKUP #"
    ,RTRIM(SN.NUMBER) AS "NUMBER"
    ,DATE(PICKUP_TSTAMP) AS "PICKUP DATE"
    ,B.DUE_DATE
    ,WEIGHT
    ,TOTAL_PIECES AS "PIECES"
    ,V.QUOTE_ID AS "QUOTE"
    ,EQUIP AS "ACTUAL QUOTE PRICE"
    ,TOTAL_CHG AS "CHARGES"
    ,B.CUST AS "ACCOUNT NUMBER"
    ,C.ACCT_SPELLING AS "ACCOUNT NAME"
    ,H.REVISION

    ,ROW_NUMBER() OVER (PARTITION BY V.QUOTE_ID ORDER BY H.REVISION DESC) RN

    FROM AF.NOTIF SN
    INNER JOIN AF.BILL B
    ON SN.NUMBER = B.NUMBER
    AND B.ARCHIVE_KEY = ''
    AND B.CORRECTED = ''
    AND B.TSTAMP >= SN.TSTAMP - 10 DAYS
    INNER JOIN AF.PROS V
    ON SN.NUMBER = V.NUMBER
    INNER JOIN AF.CHARGES H
    ON V.QUOTE_ID = H.QUOTE_ID
    AND H.STATUS = 'X'
    LEFT OUTER JOIN AF.SPELLING C
    ON B.CUST = C.ACCT_NUM
    AND C.TYPE = 'M'

    WHERE WEB_ID IN ('XXXXXXX','XXXXXXX','XXXXXXX')
    AND SN.TSTAMP > TIMESTAMP(CHAR(CURRENT DATE - 7 DAYS)||'-00.00.00.000000')

) T
WHERE T.RN = 1
ORDER BY T.PICKUP_TSTAMP

通过使用公共表表达式[CTE],尝试在两个概念查询步骤中实现这一点。首先按原样获取查询结果,但按最新(最高)修订的顺序排列行。然后仅从该CTE中选择最新的行

完成此操作后,可以将一些连接向下移动到第二部分。我试图为您演示移动一个,但您可能可以移动更多

WITH q as
(SELECT RTRIM(CUST_REF_NUMBER) AS "PICKUP #"
       ,RTRIM(SN.NUMBER)       AS "NUMBER"
       ,DATE(PICKUP_TSTAMP)    AS "PICKUP DATE"
       ,B.DUE_DATE
       ,WEIGHT
       ,TOTAL_PIECES           AS "PIECES"
       ,H.QUOTE_ID             AS "QUOTE"
       ,EQUIP                  AS "ACTUAL QUOTE PRICE"
       ,TOTAL_CHG              AS "CHARGES"
       ,B.CUST                 AS "ACCOUNT NUMBER"
       ,H.REVISION
       ,ROW_NUMBER() OVER (PARTITION BY  H.QUOTE_ID 
                           ORDER BY      H.REVISION DESC)  AS AGEING
  FROM AF.NOTIF SN
  JOIN AF.BILL B
                       ON SN.NUMBER = B.NUMBER
                      AND B.ARCHIVE_KEY = ''
                      AND B.CORRECTED = ''
                      AND B.TSTAMP >= SN.TSTAMP - 10 DAYS
  JOIN AF.PROS V
                       ON SN.NUMBER = V.NUMBER
  JOIN AF.CHARGES H
                       ON H.QUOTE_ID = V.QUOTE_ID
                      AND H.STATUS = 'X'
  WHERE WEB_ID IN ('XXXXXXX','XXXXXXX','XXXXXXX')
    AND SN.TSTAMP > TIMESTAMP(CHAR(CURRENT DATE - 7 DAYS)||'-00.00.00.000000')
 )
 SELECT
       "PICKUP #"
      ,"NUMBER"
      ,"PICKUP DATE"
      , DUE_DATE
      , WEIGHT
      ,"PIECES"
      ,"QUOTE"
      ,"ACTUAL QUOTE PRICE"
      ,"CHARGES"
      ,"ACCOUNT NUMBER"
      ,C.ACCT_SPELLING        AS "ACCOUNT NAME"
      , REVISION
  FROM q
  LEFT OUTER
  JOIN AF.SPELLING C
                       ON B.CUST = C.ACCT_NUM
                      AND C.TYPE = 'M'
  WHERE AGEING = 1
  ORDER BY PICKUP_DATE

SQL只是结构化查询语言-一种被许多数据库系统使用的语言,但不是一种数据库产品。。。很多东西都是特定于供应商的-因此我们确实需要知道您使用的是什么数据库系统(以及哪个版本)(请相应地更新标记)…如果
sql
标记上没有上述内容,则可能应该将其添加到
sql
标记中…而且它是。。。。哦,我想人们就是不读书!您使用的是SQLServer、mysql、oracle等哪个数据库?您可以使用oracle中提供的行号psuedo列。您必须确认数据库作为行号psuedo列提供的内容。有了它,您可以使用[row numer]ORDER BY H.revision DESC。尝试更新后的查询在我的回答中,我将“按短语划分”切换为H.QUOTE_ID,这样就可以使用单个表中的字段对表达式求值,希望它可以更容易地进行优化。