第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

用實(shí)例和組動(dòng)態(tài)替代樞軸

用實(shí)例和組動(dòng)態(tài)替代樞軸

HUWWW 2019-06-25 15:08:27
用實(shí)例和組動(dòng)態(tài)替代樞軸我有張桌子看起來(lái)像這樣:id    feh    bar1     10     A2     20     A3      3     B4      4     B5      5     C6      6     D7      7     D8      8     D我想讓它看起來(lái)像這樣bar  val1   val2   val3A     10     20 B      3      4 C      5        D      6      7     8我有這樣一個(gè)查詢:SELECT bar,    MAX(CASE WHEN abc."row" = 1 THEN feh ELSE NULL END) AS "val1",   MAX(CASE WHEN abc."row" = 2 THEN feh ELSE NULL END) AS "val2",   MAX(CASE WHEN abc."row" = 3 THEN feh ELSE NULL END) AS "val3"FROM(  SELECT bar, feh, row_number() OVER (partition by bar) as row  FROM "Foo" ) abcGROUP BY bar這是一種非常巧妙的方法,如果需要?jiǎng)?chuàng)建大量的新列,就會(huì)變得難以處理。我在想如果CASE語(yǔ)句可以更好地使查詢更動(dòng)態(tài)嗎?而且,我也希望看到其他的方法來(lái)做這件事。
查看完整描述

3 回答

?
海綿寶寶撒

TA貢獻(xiàn)1809條經(jīng)驗(yàn) 獲得超8個(gè)贊

如果沒(méi)有安裝附加模塊[醫(yī)]tablefunc,運(yùn)行以下命令一次每個(gè)數(shù)據(jù)庫(kù):

CREATE EXTENSION tablefunc;

對(duì)問(wèn)題的回答

對(duì)于您的情況,一個(gè)非?;镜慕徊姹斫鉀Q方案:

SELECT * FROM crosstab(
  'SELECT bar, 1 AS cat, feh
   FROM   tbl_org
   ORDER  BY bar, feh')
 AS ct (bar text, val1 int, val2 int, val3 int);  -- more columns?

這個(gè)特殊困難在這里,沒(méi)有范疇 (cat)在基表中?;?/trans>1-參數(shù)形式我們只需提供一個(gè)具有虛擬值的虛擬列作為類別。無(wú)論如何,這個(gè)值都會(huì)被忽略。

這是罕見(jiàn)病例在那里第二參數(shù)crosstab()功能是不需要,因?yàn)樗?/trans>NULL值僅顯示在此問(wèn)題的定義右側(cè)的懸空列中。的順序可以由價(jià)值.

如果我們有一個(gè)范疇列的名稱確定結(jié)果中值的順序,我們需要2-參數(shù)形式crosstab()..這里,我借助窗口函數(shù)合成了一個(gè)類別列。row_number(),到基地crosstab()關(guān)于:

SELECT * FROM crosstab(
   $$
   SELECT bar, val, feh   FROM  (
      SELECT *, 'val' || row_number() OVER (PARTITION BY bar ORDER BY feh) AS val      FROM tbl_org      ) x   ORDER BY 1, 2
   $$
 , $$VALUES ('val1'), ('val2'), ('val3')$$         -- more columns?) AS ct (bar text, val1 int, val2 int, val3 int);  -- more columns?

剩下的差不多是一成不變的。在這些緊密相關(guān)的答案中可以找到更多的解釋和鏈接。

基本要素:
如果您不熟悉crosstab()功能!

高級(jí):

適當(dāng)?shù)臏y(cè)試裝置

首先,您應(yīng)該提供一個(gè)測(cè)試用例:

CREATE TEMP TABLE tbl_org (id int, feh int, bar text);INSERT INTO tbl_org (id, feh, bar) VALUES
   (1, 10, 'A')
 , (2, 20, 'A')
 , (3,  3, 'B')
 , (4,  4, 'B')
 , (5,  5, 'C')
 , (6,  6, 'D')
 , (7,  7, 'D')
 , (8,  8, 'D');

動(dòng)態(tài)交叉表?

不太動(dòng)態(tài)然而,@Clodoaldo評(píng)論..使用plpgsql很難實(shí)現(xiàn)動(dòng)態(tài)返回類型。但在那里繞過(guò)它-有一些限制.

因此,為了不讓剩下的事情變得更復(fù)雜,我用一個(gè)更簡(jiǎn)單測(cè)試用例:

CREATE TEMP TABLE tbl (row_name text, attrib text, val int);INSERT INTO tbl (row_name, attrib, val) VALUES
   ('A', 'val1', 10)
 , ('A', 'val2', 20)
 , ('B', 'val1', 3)
 , ('B', 'val2', 4)
 , ('C', 'val1', 5)
 , ('D', 'val3', 8)
 , ('D', 'val1', 6)
 , ('D', 'val2', 7);

呼叫:

SELECT * FROM crosstab('SELECT row_name, attrib, val FROM tbl ORDER BY 1,2')AS ct (row_name text, val1 int, val2 int, val3 int);

返回:

 row_name | val1 | val2 | val3----------+------+------+------
 A        | 10   | 20   |
 B        |  3   |  4   |
 C        |  5   |      |
 D        |  6   |  7   |  8

內(nèi)建特征tablefunc模塊

tablefunc模塊為泛型提供了一個(gè)簡(jiǎn)單的基礎(chǔ)結(jié)構(gòu)。crosstab()調(diào)用,而不提供列定義列表。編寫的一些函數(shù)C(通常速度非常快):

crosstabN()


crosstab1() - crosstab4()都是預(yù)定義的。有一點(diǎn)是次要的:他們需要并返回所有text..所以我們需要integer價(jià)值。但它簡(jiǎn)化了呼叫:

SELECT * FROM crosstab4('SELECT row_name, attrib, val::text  -- cast!
                         FROM tbl ORDER BY 1,2')

結(jié)果:

 row_name | category_1 | category_2 | category_3 | category_4----------+------------+------------+------------+------------
 A        | 10         | 20         |            |
 B        | 3          | 4          |            |
 C        | 5          |            |            |
 D        | 6          | 7          | 8          |

習(xí)俗crosstab()功能

更多列其他數(shù)據(jù)類型,我們創(chuàng)造了我們自己的復(fù)合型功能(一次)。
類型:

CREATE TYPE tablefunc_crosstab_int_5 AS (
  row_name text, val1 int, val2 int, val3 int, val4 int, val5 int);

職能:

CREATE OR REPLACE FUNCTION crosstab_int_5(text)
  RETURNS SETOF tablefunc_crosstab_int_5AS '$libdir/tablefunc', 'crosstab' LANGUAGE c STABLE STRICT;

呼叫:

SELECT * FROM crosstab_int_5('SELECT row_name, attrib, val   -- no cast!
                              FROM tbl ORDER BY 1,2');

結(jié)果:

 row_name | val1 | val2 | val3 | val4 | val5----------+------+------+------+------+------
 A        |   10 |   20 |      |      |
 B        |    3 |    4 |      |      |
 C        |    5 |      |      |      |
 D        |    6 |    7 |    8 |      |

多態(tài)的,動(dòng)態(tài)的

這超出了tablefunc模塊。
為了使返回類型動(dòng)態(tài),我使用多態(tài)類型,并在這個(gè)相關(guān)的答案中詳細(xì)介紹了一種技術(shù):



1-參數(shù)形式:

CREATE OR REPLACE FUNCTION crosstab_n(_qry text, _rowtype anyelement)
  RETURNS SETOF anyelement AS$func$BEGIN
   RETURN QUERY EXECUTE 
   (SELECT format('SELECT * FROM crosstab(%L) t(%s)'
                , _qry                , string_agg(quote_ident(attname) || ' ' || atttypid::regtype                           
                , ', ' ORDER BY attnum))
    FROM   pg_attribute    WHERE  attrelid = pg_typeof(_rowtype)::text::regclass    AND    attnum > 0
    AND    NOT attisdropped);END$func$  LANGUAGE plpgsql;

使用此變體重載2-參數(shù)形式:

CREATE OR REPLACE FUNCTION crosstab_n(_qry text, _cat_qry text, _rowtype anyelement)
  RETURNS SETOF anyelement AS$func$BEGIN
   RETURN QUERY EXECUTE 
   (SELECT format('SELECT * FROM crosstab(%L, %L) t(%s)'
                , _qry, _cat_qry                , string_agg(quote_ident(attname) || ' ' || atttypid::regtype                           
                , ', ' ORDER BY attnum))
    FROM   pg_attribute    WHERE  attrelid = pg_typeof(_rowtype)::text::regclass    AND    attnum > 0
    AND    NOT attisdropped);END$func$  LANGUAGE plpgsql;

pg_typeof(_rowtype)::text::regclass:為每個(gè)用戶定義的復(fù)合類型定義了行類型,以便在系統(tǒng)目錄中列出屬性(列)。pg_attribute..要得到它的快車道:拋出已注冊(cè)的類型(regtype)到text投下這個(gè)textregclass.

創(chuàng)建組合類型一次:

您需要定義一次要使用的每個(gè)返回類型:

CREATE TYPE tablefunc_crosstab_int_3 AS (
    row_name text, val1 int, val2 int, val3 int);CREATE TYPE tablefunc_crosstab_int_4 AS (
    row_name text, val1 int, val2 int, val3 int, val4 int);...

對(duì)于臨時(shí)調(diào)用,您還可以創(chuàng)建一個(gè)臨時(shí)表產(chǎn)生同樣(臨時(shí))效果:

CREATE TEMP TABLE temp_xtype7 AS (
    row_name text, x1 int, x2 int, x3 int, x4 int, x5 int, x6 int, x7 int);

如果可用,則使用現(xiàn)有表、視圖或物化視圖的類型。

打電話

使用上述行類型:

1-參數(shù)形式(無(wú)缺失值):

SELECT * FROM crosstab_n(
   'SELECT row_name, attrib, val FROM tbl ORDER BY 1,2'
 , NULL::tablefunc_crosstab_int_3);

2-參數(shù)形式(可能缺少一些值):

SELECT * FROM crosstab_n(
   'SELECT row_name, attrib, val FROM tbl ORDER BY 1'
 , $$VALUES ('val1'), ('val2'), ('val3')$$
 , NULL::tablefunc_crosstab_int_3);

這,這個(gè)單函數(shù)適用于所有返回類型,而crosstabN()委員會(huì)提供的框架tablefunc每個(gè)模塊都需要一個(gè)單獨(dú)的函數(shù)。
如果您按照上面演示的順序命名了您的類型,則只需替換粗體數(shù)字即可。若要在基表中查找最大類別數(shù),請(qǐng)執(zhí)行以下操作:

SELECT max(count(*)) OVER () FROM tbl  -- returns 3GROUP  BY row_name
LIMIT  1;

如果你想的話,這幾乎是動(dòng)態(tài)的個(gè)別列..數(shù)組由@Clocoldo演示或簡(jiǎn)單的文本表示形式或封裝在文檔類型中的結(jié)果,如jsonhstore可以動(dòng)態(tài)地處理任意數(shù)量的類別。

免責(zé)聲明:
當(dāng)用戶輸入轉(zhuǎn)換為代碼時(shí),總是存在潛在的危險(xiǎn)。確保這不能用于SQL注入。不要接受來(lái)自不可信用戶的輸入(直接)。

要求提出原始問(wèn)題:

SELECT * FROM crosstab_n('SELECT bar, 1, feh FROM tbl_org ORDER BY 1,2'
                       , NULL::tablefunc_crosstab_int_3);


查看完整回答
反對(duì) 回復(fù) 2019-06-25
?
RISEBY

TA貢獻(xiàn)1856條經(jīng)驗(yàn) 獲得超5個(gè)贊

我已經(jīng)在其他答案中建議了JSON方法,在9.6的方便之前。json_object_agg功能。使用以前的工具集只需要更多的工作。

引用的兩個(gè)可能的缺點(diǎn)實(shí)際上不是。如果有必要,對(duì)隨機(jī)密鑰順序進(jìn)行小的修正。丟失的鍵(如果相關(guān)的話)需要處理幾乎微不足道的代碼:

select
    row_name as bar,
    json_object_agg(attrib, val order by attrib) as datafrom
    tbl    right join
    (
        (select distinct row_name from tbl) a        cross join
        (select distinct attrib from tbl) b    ) c using (row_name, attrib)group by row_nameorder by row_name;
 bar |                     data                     
-----+----------------------------------------------
 a   | { "val1" : 10, "val2" : 20, "val3" : null }
 b   | { "val1" : 3, "val2" : 4, "val3" : null }
 c   | { "val1" : 5, "val2" : null, "val3" : null }
 d   | { "val1" : 6, "val2" : 7, "val3" : 8 }

對(duì)于理解JSON的最后一個(gè)查詢使用者來(lái)說(shuō),沒(méi)有缺點(diǎn)。唯一的原因是它不能作為表源使用。


查看完整回答
反對(duì) 回復(fù) 2019-06-25
  • 3 回答
  • 0 關(guān)注
  • 394 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)