【问题标题】:Calculate date range between two rows计算两行之间的日期范围
【发布时间】:2019-02-14 07:30:32
【问题描述】:

我有一张表格,其中有材料成本,这些成本会根据日期发生变化并记录到表格中。 请参阅下图了解更多详情。

如果您看到输入表,在第一行材料 XYZ 成本是从 '6/29/2018' 到 '12/31/9999' 的 43.14 并且在第二行中材料的成本再次更改为 44,现在 datefrom 是'8/3/2018' 等等,现在我想根据第二行 datefrom 获取第一行的日期范围(dateto),该日期距离第二个 datefrom 不到一天('8/2/2018 '),在所需的输出表中突出显示。

我尝试过内部联接和其他查询,但无法获得所需的输出。

【问题讨论】:

  • 您的问题表明您想计算成本,但您没有提供任何公式。相反,您的表格显示了更改值的日期,但您没有解释这是如何发生的?请编辑您的问题以帮助解释您的问题。同时显示您尝试过的任何 SQL。
  • @StephenQuan 我已经编辑了这个问题,如果你还不清楚,请告诉我。
  • 您真正的问题是如何使用后续行中的“datefrom”(减去 1 天)填充“dateto”。那会更清楚。人们会更快地提出解决方案。我认为您不应该使用 COST 列找到该解决方案。您应该使用主键或 rowid 解决问题。请说明您解决此问题的一些尝试。

标签: mysql sql mysql-workbench


【解决方案1】:

你可以试试这个吗?

WITH TEMP AS
(
    SELECT 
        RANK() OVER ( PARTITION BY MATERIAL ORDER BY DATEFROM ASC) AS ASC_RANK,
        RANK() OVER ( PARTITION BY MATERIAL ORDER BY DATEFROM DESC) AS DES_RANK,
        MATERIAL, COST, DATEFROM, DATETO
    FROM 
)
SELECT MATERIAL, COST, DATEFROM, DATETO
FROM TEMP
WHERE DES_RANK = 1 

UNION ALL 

SELECT T1.MATERIAL, T1.COST, T1.DATEFROM, (T2.DATETO - 1) AS DATETO
FROM TEMP T1
JOIN TEMP T2 ON T1.MATERIAL = T2.MATERIAL AND T1.ASC_RANK = (T2.ASC_RANK + 1)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-19
    • 1970-01-01
    • 1970-01-01
    • 2020-02-20
    • 1970-01-01
    相关资源
    最近更新 更多