我有一個表,其結構如下所示:
k | i | p | v
請注意,鍵 (k) 不是唯一的,沒有鍵,什么也沒有。每個鍵可以有多個屬性 (i = 0, 1, 2, ...),它們可以是不同的型別 (p) 并具有不同的值 (v)。一種屬性型別也可能出現多次(p(i-1) = p(i))。
我想要做的是選擇某些屬性型別及其對應的值并將它們放在同一行中。例如我想要:
k | attr_name1 | attr_name2
我設法進行了一個查詢,該查詢適用于 attr_name1 和 attr_name2 出現在初始表的列 p 中的所有鍵 (k):
SELECT DISTINCT ON (key) fn.k AS key, fn.v AS attr_name1, a.v AS attr_name2
FROM Table fn
LEFT JOIN Table a ON fn.k = a.k
AND a.p = 'attr_name2'
WHERE fn.p = 'attr_name1'
但是,我想考慮某個鍵沒有名為 attr_name1 的屬性的情況,并將 NULL 值插入到新表的相應列中。我不確定如何實作這一目標。我使用多個查詢或中間表等沒有問題,但是表中有很多行,我需要一些可以擴展到數百萬行的東西。
任何幫助,將不勝感激。
例子:
k i p v
1 0 a 10
1 1 b 12
1 2 c 34
1 3 d 44
1 4 e 09
2 0 a 11
2 1 b 13
2 2 d 22
2 3 f 34
會變成(假設我只對 a、b、c 列感興趣):
k a b c
1 10 12 34
2 11 13 NULL
uj5u.com熱心網友回復:
我會使用條件聚合。也就是說,圍繞CASE運算式的聚合函式。
SELECT
k,
MAX(CASE WHEN p='a' THEN v END) AS a,
MAX(CASE WHEN p='b' THEN v END) AS b,
MAX(CASE WHEN p='c' THEN v END) AS c
FROM
your_table
GROUP BY
k
這假定這(k, p)是唯一的。如果有重復的鍵,這將清楚地找到v具有最高值的鍵(對于每個(k,p))
作為一般規則,這種透視使資料更難在 SQL 中處理。這通常用于顯示目的,因為人類發現這更易于閱讀。但是,從軟體工程的角度來看,這種格式化不應該在資料層進行;請注意,這樣做實際上不會使您未來的生活變得更加艱難。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/321573.html
標籤:sql PostgreSQL
上一篇:postgres中的模式和觸發器
