-2

示例图片

我一直在研究这个 SQL 代码,但我无法让它像我想要的那样显示。我有一项操作,我们将零件发送到我们的业务之外,但该操作发送的时间没有时间戳。

我正在使用上一个操作的最后劳动日期和采购订单创建日期来尝试找出该部门发出采购订单需要多长时间。

我已尝试将 LAST_Value 添加到我的查询中。我什至玩过 LAG,除了错误什么都没有。

SELECT
    JobOpDtl.JobNum,
    JobOpDtl.OprSeq,
    JobOpDtl.OpDtlDesc,
    LastValue.ClockInDate,
    LastValue.LastValue
FROM Erp.JobOpDtl
LEFT OUTER JOIN Erp.LaborDtl ON
    LaborDtl.JobNum = JobOpDtl.JobNum
    and LaborDtl.OprSeq = JobOpDtl.OprSeq
LEFT OUTER JOIN (
                Select
                    LaborDtl.JobNum,
                    LaborDtl.OprSeq,
                    MAX(LaborDtl.ClockInDate) as ClockInDate,
                    LAST_VALUE (LaborDtl.ClockInDate) OVER (PARTITION BY OprSeq ORDER BY JobNum) as LastValue
                FROM Erp.LaborDtl
                GROUP BY
                    LaborDtl.JobNum,
                    LaborDtl.OprSeq,
                    LaborDtl.ClockInDate
            ) as LastValue ON
                JobOpDtl.JobNum = LastValue.JobNum
                and JobOpDtl.OprSeq = LastValue.OprSeq

WHERE JobOpDtl.JobNum = 'PA8906'
GROUP BY 
    JobOpDtl.JobNum,
    LastValue.OprSeq,
    JobOpDtl.OpDtlDesc,
    JobOpDtl.OprSeq,
    LastValue.ClockInDate,
    LastValue.LastValue

没有错误,只是没有显示我想要的方式。

我希望它显示带有上一个 OperSeq 上次交易日期的 OperSeq。

4

1 回答 1

0

您想要的基本功能是 LAG(如您所建议的),但您需要将其包装在 COALESCE 中。这是说明该概念的示例代码

SELECT * INTO #Jobs
FROM (VALUES ('P1','Step1', '2019-04-01'), ('P1','Step2', '2019-04-02')
    , ('P1','Step3', '2019-04-03'), ('P1','Step4', NULL), 
    ('P2','Step1', '2019-04-01'), ('P2','Step2', '2019-04-03')
    , ('P2','Step3', '2019-04-06'), ('P2','Step4', NULL)
) as JobDet(JobNum, Descript, LastDate)

SELECT * 
    , COALESCE( LastDate, LAG(LastDate,1) 
        OVER(PARTITION BY JobNum 
        ORDER BY COALESCE(LastDate,GETDATE()))) as LastValue
FROM #Jobs
ORDER BY JobNum, Descript

DROP TABLE #Jobs

要将其应用于您的特定问题,我建议使用替换 LastValue 的 COMMON TABLE EXPRESSION 并使用它而不是原始表进行查询。

您的示例图片与您在代码中引用的任何表都不匹配(如果您包含创建与代码中引用的临时表匹配的代码,这将对我们有很大帮助)所以这是一个猜测,但它会是这样的:

;WITH cteJob as (
    SELECT JobNum, OprSeq, OpDtlDesc, ClockInDate
    , COALESCE( LastValue, LAG(LastValue,1) 
        OVER(PARTITION BY JobNum 
        ORDER BY COALESCE(LastValue,GETDATE()))) as LastValue
    FROM Erp.JobOptDtl
) SELECT * 
FROM cteJob as J 
    LEFT OUTER JOIN LaborDtl as L 
        on J.JobNum = JobNum 
            AND J.OprSeq = L.OprSeq

顺便说一句,如果您清理您的问题以提供更好的数据示例(即 SELECT INTO 语句,就像我的答案开头那样生成与您的代码中的表格相对应的表格,而不是 Excel 文件的图像)我可能能够让你更接近你所需要的,但希望这足以让你走上正确的轨道,这是我迄今为止所能做的最好的。

于 2019-09-10T16:36:31.893 回答