仅选择截止日期最早的记录

时间:2020-01-30 03:26:51

标签: sql sql-server

我尝试了以下查询,该查询将返回每个STOCKCODE的所有行,就像我只有在最早的PurchOrd_Lines.Due Date记录之后一样

SELECT 
    PURCHORD_LINES.STOCKCODE,
    STOCK_ITEMS.DESCRIPTION,
    (X_FREE_STOCK_VW.PhysicalQty - X_FREE_STOCK_VW.CommittedQty) AS 'FREE STOCK',
    X_FREE_STOCK_VW.PhysicalQty AS 'On Hand',
    X_FREE_STOCK_VW.CommittedQty AS 'Committed',
    X_FREE_STOCK_VW.IncommingQty AS 'Purch_Ord',
    PURCHORD_LINES.HDR_SEQNO,
    (PURCHORD_LINES.ORD_QUANT-PURCHORD_LINES.SUP_QUANT) AS 'QTY',
    CONVERT(DATETIME, MIN(PURCHORD_LINES.DUEDATE), 103) AS 'ETA', 
    PURCHORD_HDR.X_PURCHASEORDERREF AS 'Reference'
FROM 
    PURCHORD_LINES PURCHORD_LINES
JOIN 
    STOCK_ITEMS ON STOCK_ITEMS.STOCKCODE = PURCHORD_LINES.STOCKCODE
JOIN 
    X_FREE_STOCK_VW ON X_FREE_STOCK_VW.STOCKCODE = PURCHORD_LINES.STOCKCODE
JOIN 
    PURCHORD_HDR ON PURCHORD_HDR.SEQNO = PURCHORD_LINES.HDR_SEQNO
WHERE 
    X_FREE_STOCK_VW.LOCATION = 1
    AND STOCK_ITEMS.STOCK_CLASSIFICATION IN (0,10,20,200,210,220) 
    AND STOCK_ITEMS.STOCKCODE NOT LIKE '%2' AND STOCK_ITEMS.STOCKCODE NOT LIKE  '%3'
    AND (X_FREE_STOCK_VW.PhysicalQty - X_FREE_STOCK_VW.CommittedQty) <= 0
         AND X_FREE_STOCK_VW.CommittedQty > 0
         AND LEN(STOCK_ITEMS.STOCKCODE) > 6
    AND STOCK_ITEMS.DESCRIPTION IS NOT NULL 
    AND STOCK_ITEMS.DESCRIPTION != ''
    AND STOCK_ITEMS.SUPPLIERNO IN (1009, 1024, 1068, 1115, 1146, 1170, 1259, 1306, 1410, 2768)
    AND STOCK_ITEMS.X_BUYER = 'P'
    AND ((PURCHORD_LINES.ORD_QUANT - PURCHORD_LINES.SUP_QUANT) > 0 AND
         (PURCHORD_LINES.SUP_QUANT/PURCHORD_LINES.ORD_QUANT) < 0.9)
    AND ((PURCHORD_HDR.STATUS <> 2)
         AND (PURCHORD_HDR.X_DELIVERYSTATUS <> 4) 
         AND (PURCHORD_LINES.ORD_QUANT > 0))
GROUP BY 
    PURCHORD_LINES.STOCKCODE, STOCK_ITEMS.DESCRIPTION, 
    X_FREE_STOCK_VW.PhysicalQty, X_FREE_STOCK_VW.CommittedQty, 
    X_FREE_STOCK_VW.IncommingQty, PURCHORD_LINES.HDR_SEQNO,
    PURCHORD_LINES.ORD_QUANT, PURCHORD_LINES.SUP_QUANT, 
    PURCHORD_HDR.X_PURCHASEORDERREF

输出为

STOCKCODE| FREE STOCK  |On Hand |Committed|Purch_Ord|HDR_SEQNO|QTY|ETA        |Reference
42165    | -351        |-29     |322      |406      |106200   |84 |21/02/2020 |426/19
42165    | -351        |-29     |322      |406      |107052   |87 |20/03/2020 |454/19
42165    | -351        |-29     |322      |406      |107626   |150|11/04/2020 |024/20 
42166    | -15         |41      |57       |406      |107626   |150|13/02/2020 |074/20
42166    | -15         |41      |57       |406      |107626   |150|17/02/2020 |089/20

鉴于我只需要返回每个股票代码的最早日期(ETA)的行。怎么了?

2 个答案:

答案 0 :(得分:1)

您可以使用row_number实现此目的

with data
  as ( /*The original query*/
   SELECT  
        PURCHORD_LINES.STOCKCODE,
        STOCK_ITEMS.DESCRIPTION,
        (X_FREE_STOCK_VW.PhysicalQty - X_FREE_STOCK_VW.CommittedQty) AS 'FREE STOCK',
        X_FREE_STOCK_VW.PhysicalQty AS 'On Hand',
        X_FREE_STOCK_VW.CommittedQty AS 'Committed',
        X_FREE_STOCK_VW.IncommingQty AS 'Purch_Ord',
        PURCHORD_LINES.HDR_SEQNO,
        (PURCHORD_LINES.ORD_QUANT-PURCHORD_LINES.SUP_QUANT) AS 'QTY',
        CONVERT(DATETIME, MIN(PURCHORD_LINES.DUEDATE), 103) AS 'ETA', 
        PURCHORD_HDR.X_PURCHASEORDERREF AS 'Reference'
    FROM PURCHORD_LINES PURCHORD_LINES
    JOIN STOCK_ITEMS ON STOCK_ITEMS.STOCKCODE = PURCHORD_LINES.STOCKCODE
    JOIN X_FREE_STOCK_VW ON X_FREE_STOCK_VW.STOCKCODE = PURCHORD_LINES.STOCKCODE
    JOIN PURCHORD_HDR ON PURCHORD_HDR.SEQNO = PURCHORD_LINES.HDR_SEQNO
   WHERE X_FREE_STOCK_VW.LOCATION = 1
     AND STOCK_ITEMS.STOCK_CLASSIFICATION IN (0,10,20,200,210,220) 
     AND STOCK_ITEMS.STOCKCODE NOT LIKE '%2' AND STOCK_ITEMS.STOCKCODE NOT LIKE '%3'
     AND (X_FREE_STOCK_VW.PhysicalQty - X_FREE_STOCK_VW.CommittedQty) <= 0
     AND X_FREE_STOCK_VW.CommittedQty > 0
     AND LEN(STOCK_ITEMS.STOCKCODE) > 6
     AND STOCK_ITEMS.DESCRIPTION IS NOT NULL 
     AND STOCK_ITEMS.DESCRIPTION != ''
     AND STOCK_ITEMS.SUPPLIERNO IN (1009,1024,1068,1115,1146,1170,1259,1306,1410,2768)
     AND STOCK_ITEMS.X_BUYER = 'P'
     AND ((PURCHORD_LINES.ORD_QUANT - PURCHORD_LINES.SUP_QUANT) > 0 AND (PURCHORD_LINES.SUP_QUANT/PURCHORD_LINES.ORD_QUANT)<0.9)
     AND ((PURCHORD_HDR.STATUS<>2)
     AND (PURCHORD_HDR.X_DELIVERYSTATUS<>4) 
     AND (PURCHORD_LINES.ORD_QUANT>0))
GROUP BY PURCHORD_LINES.STOCKCODE
        , STOCK_ITEMS.DESCRIPTION
        , X_FREE_STOCK_VW.PhysicalQty
        , X_FREE_STOCK_VW.CommittedQty
        , X_FREE_STOCK_VW.IncommingQty
        , PURCHORD_LINES.HDR_SEQNO
        , PURCHORD_LINES.ORD_QUANT
        , PURCHORD_LINES.SUP_QUANT
        , PURCHORD_HDR.X_PURCHASEORDERREF
      )
  ,interim_data
   as ( 
        select *,row_number() over(partition by stockcode order by eta asc) as rnk
          from data   
      )
select *
  from iterim_data
 where rnk=1

答案 1 :(得分:0)

也许这种方式可以帮助您

SELECT ETA, * 
FROM (SELECT  PURCHORD_LINES.STOCKCODE, 
CONVERT(DATETIME, MIN(PURCHORD_LINES.DUEDATE), 103) AS 'ETA' 
FROM PURCHORD_LINES PURCHORD_LINES 
GROUP BY PURCHORD_LINES.STOCKCODE ) as PURCHORD_ETA 
JOIN PURCHORD_LINES ON PURCHORD_LINES.STOCKCODE = PURCHORD_ETA.STOCKCODE 
JOIN ... 
WHERE ... 
GROUP BY ...

尝试子查询,将更容易理解

相关问题