Du kan använda den medföljande C-funktionen crosstab_hash
för detta.
Manualen är inte särskilt tydlig i detta avseende. Det nämns i slutet av kapitlet om crosstab()
med två parametrar:
Du kan skapa fördefinierade funktioner för att undvika att behöva skriva ut resultatkolumnnamn och typer i varje fråga. Se exemplen i föregående avsnitt. Den underliggande C-funktionen för denna form av
crosstab
hetercrosstab_hash
.
För ditt exempel:
CREATE OR REPLACE FUNCTION f_cross_test_db(text, text)
RETURNS TABLE (kernel_id int, key1 int, key2 int, key3 int)
AS '$libdir/tablefunc','crosstab_hash' LANGUAGE C STABLE STRICT;
Ring:
SELECT * FROM f_cross_test_db(
'SELECT kernel_id, key, value FROM test_db ORDER BY 1,2'
,'SELECT DISTINCT key FROM test_db ORDER BY 1');
Observera att du måste skapa en distinkt crosstab_hash
funktion för varje crosstab
funktion med en annan returtyp.
Relaterat:
- PostgreSQL rad till kolumner
Din funktion för att generera kolumnlistan är ganska invecklat, resultatet är felaktigt (int
saknas efter kernel_id
), kan den ersättas med denna SQL-fråga:
SELECT 'kernel_id int, '
|| string_agg(DISTINCT key::text, ' int, ' ORDER BY key::text)
|| ' int, DUMMY text'
FROM test_db;
Och den kan inte användas dynamiskt ändå.