簡體   English   中英

SQL 從一列返回值的查詢是重復的,但在另一列中有 1 null 和一個值

[英]SQL query that returns the value from one column which is duplicated but in other column has 1 null and one value

重要提示:元數據庫 SQL 是只讀的,此元數據庫使用的是 POSTGRESQL。

我需要的查詢是:返回 Shipment 中的所有值,這些值在 shipment col 中具有相同的編號,並且在 col Origin 中具有 1 null 和 1 個值(耦合)。

這是我的桌子:

起源 運輸 產品 數量
購買.23 裝運.42 356 2個
裝運.42 356 2個
購買.25 裝運.422 256 4個
裝運.422 256 4個
購買.18 裝運.427 666 4個
裝運.427 666 4個
購買.20 裝運.427 666 3個
裝運.427 666 3個
購買.22 裝運.427 677 4個
裝運.427 677 3個
發貨.9999 222 9
裝運.427 677 1個
發貨.9999 222 9
發貨.1111 7 11
發貨.1111 564 6個
裝運.5555 756 1個
裝運.4444 755 5個
購買.77 裝運.3333 751 9

請注意上表中,Purchase.22 的 Quantity 為 4,並且有兩批貨與 Purchase.22 行相同,數量為 1 和 3,兩者總和為 Purchase.22 行的 4。

查詢應該返回這個:

起源 運輸 產品 數量
購買.23 裝運.42 356 2個
裝運.42 356 2個
購買.25 裝運.422 256 4個
裝運.422 256 4個
購買.18 裝運.427 666 4個
裝運.427 666 4個
購買.20 裝運.427 666 3個
裝運.427 666 3個
購買.22 裝運.427 677 4個
裝運.427 677 4個

如果可能的話,另一個查詢返回這個,沒有任何一對 Origin null 與 Shipment.xx,Origin Purchase 與 Shipment.xx 的產品:

起源 運輸 產品 數量
發貨.9999 222 9
發貨.9999 222 9
發貨.1111 7 11
發貨.1111 564 6個
裝運.5555 756 1個
裝運.4444 755 5個
購買.77 裝運.3333 751 9

更多信息,我正在開發一個名為 Metabase 的 BI 工具,我是一名大三學生,一個月前剛開始工作,他們給了我這些事情要做,我正在做的查詢是要知道有多少篇文章我有在ivnentory。 不幸的是,有些文章是重復的,如果它們都是重復的,我可以很容易地將數量除以 2。但我從來都不容易。 我有完全沒有來源的價值和沒有裝運的價值,並且兩者都沒有與具有這兩種價值的其他價值相結合,以及其他一式三份且具有不同數量的產品,因此我不能那么容易地划分它。

我試圖在表中找到其他列的任何模式,但至少在 shipment.out 上沒有任何效果,而在 shipment.out.return 等其他裝運值中,我找到了無需使用 SQL 查詢即可幫助我的模式。

我試圖在表中找到其他列的任何模式,但至少在 shipment.out 上沒有任何效果,而在 shipment.out.return 等其他裝運值中,我找到了無需使用 SQL 查詢即可幫助我的模式。

首先,您需要匯總 <shipment, product> 的數量。

然后你可以select:

  • 每個 <shipment, product, quantity> 的最后一個值
  • 每個 <shipment, product, quantity> 的計數

過濾掉所有計數小於 1 且 <origin, last origin> 都設置為 null 的行。

此處查看演示。


如果<shipment, product> 可以有多條記錄並且需要匯總數量,則需要在執行此查詢之前進行匯總。 它看起來像這樣:

WITH cte AS (
    SELECT MAX(Origin) AS Origin, Shipment, Product, SUM(Quantity) AS Quantity
    FROM tab
    GROUP BY COALESCE(Origin, 'NULL'), Shipment, Product
), cte2 AS (
    SELECT *, 
           LAG(Origin) OVER(PARTITION BY Shipment, Product, Quantity ORDER BY Shipment, Origin) AS last_val, 
           COUNT(*) OVER(PARTITION BY Shipment, Product, Quantity) AS cnt
    FROM cte
)
SELECT Origin,
       Shipment,
       Product, 
       Quantity
FROM cte2
WHERE COALESCE(Origin, last_val) IS NOT NULL AND cnt > 1
ORDER BY shipment

Output:

起源 運輸 產品 數量
購買.23 裝運.42 356 2個
null 裝運.42 356 2個
購買.25 裝運.422 256 4個
null 裝運.422 256 4個
購買.20 裝運.427 666 3個
null 裝運.427 666 3個
購買.18 裝運.427 666 4個
null 裝運.427 666 4個
購買.22 裝運.427 677 4個
null 裝運.427 677 4個

此處查看演示。

暫無
暫無

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

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