簡體   English   中英

如何從另一個表中獲取最后 2 條記錄作為列

[英]How can I get last 2 records from another table as columns

我有一個名為 products 的表,具有此架構:

CREATE TABLE products (
  id INT PRIMARY KEY,
  sku TEXT NOT NULL,
  fee REAL
);

另一個帶有此模式的費用更改日志的表:

CREATE TABLE fee_change(
  id SERIAL PRIMARY KEY,
  sku_id INT NOT NULL,
  old_fee REAL NOT NULL,
  new_fee REAL NOT NULL,
  FOREIGN KEY (sku_id) REFERENCES products(id)
);

無論如何要在一個 sql 中獲取每個 sku 的最后 2 次費用更改,而不是每個 sku 的 2 行,我想有 2 個新列,其中包含 old_fee_1、new_fee_1、old_fee_2、new_fee_2:

期望的結果:

   id   |    sku   |   old_fee_1  |  new_fee_1  |  old_fee_2  |  new_fee_2
    1   |    ASC   |      4       |     2.5     |      3      |      4
    2   |    CF2   |      4       |      1      |      3      |      4
    3   |    RTG   |     0.5      |      1      |      2      |     0.5
    4   |    VHN5  |     null     |     null    |     null    |     null

小提琴手

作為起點,我從您鏈接的小提琴中獲取了您的查詢:

SELECT *
FROM products AS p
LEFT JOIN LATERAL (
    SELECT *
    FROM fee_change
    WHERE sku_id = p.id
    ORDER BY id DESC
    LIMIT 2
) AS oo
ON true

演示:數據庫<>小提琴

您可以使用FILTER子句(或者它也適用於CASE WHEN構造)到 pivot 您的連接表。 要獲得 pivot 值,您可以添加行計數(使用row_number() window 函數):

SELECT 
    p.id, p.sku, p.fee,
    MAX(old_fee) FILTER (WHERE row_number = 1) AS old_fee_1,       -- 2
    MAX(new_fee) FILTER (WHERE row_number = 1) AS new_fee_1,
    MAX(old_fee) FILTER (WHERE row_number = 2) AS old_fee_2,
    MAX(new_fee) FILTER (WHERE row_number = 2) AS new_fee_2
    
FROM products AS p
LEFT JOIN LATERAL (
    SELECT 
        *,
        row_number() OVER (PARTITION BY sku_id)                    -- 1
    FROM fee_change
    WHERE sku_id = p.id
    ORDER BY id DESC
    LIMIT 2
) AS oo ON true

GROUP BY p.id, p.sku, p.fee                                        -- 2
  1. 創建 pivot 值
  2. 執行過濾聚合以創建數據透視表。

這樣的事情應該可以解決問題:

SELECT p.id, 
       p.sku,
       old.old_fee_1,
       old.new_fee_1,
       new.old_fee_2,
       new.new_fee_2        
FROM products p
LEFT JOIN (SELECT fee.sku_id id, fee.old_fee old_fee_1, fee.new_fee new_fee_1 
           FROM fee_change ORDER BY fee.id DESC LIMIT 1 OFFSET 1) old ON old.id = p.id

LEFT JOIN (SELECT fee.sku_id id, fee.old_fee old_fee_2, fee.new_fee new_fee_2 
          FROM fee_change ORDER BY fee.id DESC LIMIT 1 OFFSET 0) new ON new.id = p.id

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM