找到第一个负值(如果存在),然后在日期之间进行减法

问题描述 投票:0回答:1

我有隔壁桌

产品 植物 商店 日期 库存
123456 A123 Z12 0 2001-01-01 -24
123456 A123 Z12 1 2001-01-08 -60
123456 A123 Z12 2 2001-01-16 -60
789123 B345 123 0 2001-01-01 10
789123 B345 123 1 2001-01-08 -20
789123 B345 123 2 2001-01-16 -30
013579 C678 1A3 0 2001-01-01 10
013579 C678 1A3 1 2001-01-08 20
013579 C678 1A3 2 2001-01-16 30

所以我想获取第一个负值,然后获取其日期,并在第一个日期(周=0)和第一个负值的日期之间进行减法,但如果不是负值,则获取最后一个正值,并在第一个日期(位于“周”列中且值=0)和最后一个日期(位于“周”列中且值=2)之间进行减法。所以最后我会得到一个像这样的表:

产品 植物 商店 天差
123456 A123 Z12 0
789123 B345 123 7
013579 C678 1A3 15

DaysDiff 列中的结果是由于

(2001-01-01)-(2001-01-01)=0
(2001-01-01)-(2001-01-08)=7
(2001-01-01)-(2001-01-16)=15

我写的查询是这样的:

SELECT
    Product,
    Plant,
    Store,
    CASE
        WHEN MIN(CASE WHEN Stock < 0 THEN Date END) IS NOT NULL THEN
            DATEDIFF(WEEK, 
                MIN(CASE WHEN Stock < 0 THEN Date END),
                MIN(CASE WHEN Week = 0 THEN Date END)
            )
        ELSE
            DATEDIFF(WEEK, 
                MAX(CASE WHEN Week = 0 THEN Date END),
                MIN(Date)
            )
    END AS DaysDiff
FROM Table
GROUP BY
    Product,
    Plant,
    Store
ORDER BY Product, Plant, Store;

但我只得到一个结果。

产品 植物 商店 天差
123456 A123 Z12 0

有什么帮助吗?

postgresql date subquery case negative-number
1个回答
0
投票

更简单的做法:

SELECT product, plant, store
     , COALESCE(min(date) FILTER (WHERE stock < 0), max(date)) - min(date) AS days_diff
FROM   tbl
GROUP  BY 1,2,3
ORDER  BY 1,2,3;

小提琴

Postgres 中没有

DATEDIFF()
函数。 (您可能会想到 MySQL?
要获得日期之间的差异,只需减去即可。参见:

关于聚合

FILTER
条款:

COALESCE
最终确定。

关于(可选!)序数短语法:

© www.soinside.com 2019 - 2024. All rights reserved.