Sql 需要将查询中的结果限制为某列中的最大值
下面的查询为我提供了所需的所有信息。然而,由于修订级别,我得到了多个结果。大多数结果集的第一个也是唯一一个修订版返回空白。如果一个报价已经被修改,它将被指定为修订版a。如果它再次被修改,它将得到B。我将得到空白、a、B等的结果。我想将查询限制为仅在不为空白时才看到最大值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" ,
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,这样就可以使用单个表中的字段对表达式求值,希望它可以更容易地进行优化。