存在负值时仅获取第一行,否则获取最后一个正值

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

我有隔壁桌

产品 植物 商店 文字 日期 库存
123456 A123 Z12 你好世界 1 2001-01-01 20
123456 A123 Z12 你好世界 2 2001-01-08 -15
123456 A123 Z12 你好世界 3 2001-01-16 -20
789123 B345 123 你好世界1 1 2001-01-01 10
789123 B345 123 你好世界1 2 2001-01-08 20
789123 B345 123 你好世界1 3 2001-01-16 30

所以我想获取第一个负值的行,但如果不是负值,则获取最后一个正值。还像这样重组了表格。

产品 植物 商店 文字 开始日期 库存开始 日期_完成 库存_已完成
123456 A123 Z12 你好世界 2001-01-01 20 2001-01-08 -15
789123 B345 123 你好世界1 2001-01-01 10 2001-01-16 30

我尝试了多个查询,但结果最接近的一个如下:

SELECT Product,Plant,Store,Text,Date, Stock FROM table
WHERE (Stock)<0 
order by Product,Plant,Store,Text,Date, Stock asc

我也尝试使用

FETCH FIRST 1 ROWS ONLY
,但我收到了下一个错误
ERROR: Syntax error at or near "FIRST"
。 另一个查询如下:

WITH added_row_number AS (
  SELECT
    *,
    ROW_NUMBER() OVER(PARTITION BY Product,Plant,Store ORDER BY Date ASC) AS row_number
  FROM MM_STOCK
)
SELECT
  *
FROM added_row_number
WHERE (Stock)<0 AND row_number = 1;

但是要注意数据,如果我添加案例陈述,我会收到错误

ERROR: Syntax error at or near "CASE"
。有什么帮助吗?

postgresql case with-statement negative-number
1个回答
0
投票

可以使用一些子选择来解决这个问题

SELECT "Product", "Plant", "Store"
  , (SELECT "Date" FROM Table2 t2 WHERE t1."Product" = t2."Product" AND  t1."Plant" = t2."Plant"
  AND t1."Store"  = t2."Store" ORDER BY "Week" ASC  LIMIT 1) start_date
  
  , (SELECT "Stock" FROM Table2 t2 WHERE t1."Product" = t2."Product" AND  t1."Plant" = t2."Plant"
  AND t1."Store"  = t2."Store"  ORDER BY "Week" ASC LIMIT 1) start_stock
    , (SELECT "Date" FROM Table2 t2 WHERE t1."Product" = t2."Product" AND  t1."Plant" = t2."Plant"
  AND t1."Store" = t2."Store" ORDER BY "Week" DESC LIMIT 1) en_date
  
  , (SELECT "Stock" FROM Table2 t2 WHERE t1."Product" = t2."Product" AND  t1."Plant" = t2."Plant"
  AND t1."Store" = t2."Store"  ORDER BY "Week" DESC LIMIT 1) end_stock
  FROM
 Table2 t1
  GROUP BY 
    "Product", "Plant", "Store"
产品 植物 商店 开始日期 起始库存 en_日期 最终库存
789123 B345 123 2001-01-01 10 2001-01-16 30
123456 A123 Z12 2001-01-01 20 2001-01-16 -20
SELECT 2

小提琴

你不需要这个聚合,我找不到不起作用的版本 postgres

SELECT DISTINCT "Product", "Plant", "Store"
  , (SELECT "Date" FROM Table2 t2 WHERE t1."Product" = t2."Product" AND  t1."Plant" = t2."Plant"
  AND t1."Store"  = t2."Store" ORDER BY "Week" ASC  LIMIT 1) start_date
  
  , (SELECT "Stock" FROM Table2 t2 WHERE t1."Product" = t2."Product" AND  t1."Plant" = t2."Plant"
  AND t1."Store"  = t2."Store"  ORDER BY "Week" ASC LIMIT 1) start_stock
    , (SELECT "Date" FROM Table2 t2 WHERE t1."Product" = t2."Product" AND  t1."Plant" = t2."Plant"
  AND t1."Store" = t2."Store" ORDER BY "Week" DESC LIMIT 1) en_date
  
  , (SELECT "Stock" FROM Table2 t2 WHERE t1."Product" = t2."Product" AND  t1."Plant" = t2."Plant"
  AND t1."Store" = t2."Store"  ORDER BY "Week" DESC LIMIT 1) end_stock
  FROM
 Table2 t1

产品 植物 商店 开始日期 起始库存 en_日期 最终库存
123456 A123 Z12 2001-01-01 20 2001-01-16 -20
789123 B345 123 2001-01-01 10 2001-01-16 30
SELECT 2

小提琴

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