<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0">
	<channel>
		<title><![CDATA[Forum PostgreSQL - grupy przedziałów]]></title>
		<link>https://forum.postgresql.org.pl/viewtopic.php?id=1225</link>
		<description><![CDATA[Najświeższe odpowiedzi w grupy przedziałów.]]></description>
		<lastBuildDate>Wed, 15 Feb 2012 22:17:20 +0000</lastBuildDate>
		<generator>PunBB</generator>
		<item>
			<title><![CDATA[Odp: grupy przedziałów]]></title>
			<link>https://forum.postgresql.org.pl/viewtopic.php?pid=3445#p3445</link>
			<description><![CDATA[Użyj zamiast tego array_upper, jako drugi parametr także jedynka.]]></description>
			<author><![CDATA[dummy@example.com (gszpetkowski)]]></author>
			<pubDate>Wed, 15 Feb 2012 22:17:20 +0000</pubDate>
			<guid>https://forum.postgresql.org.pl/viewtopic.php?pid=3445#p3445</guid>
		</item>
		<item>
			<title><![CDATA[Odp: grupy przedziałów]]></title>
			<link>https://forum.postgresql.org.pl/viewtopic.php?pid=3444#p3444</link>
			<description><![CDATA[kolejny problem

ERROR:  function array_length(integer[], integer) does not exist
LINE 2:     Case When (array_length(dane_array, 1) > 1) Then

patrząc do dokumentacji nie mogę się doszukać funkcji array_length

[url]http://www.postgresql.org/docs/8.3/static/functions-array.html[/url]

wersji 8.3 nie mogę zmienić.


po zamianie na array_upper mam błąd 

ERROR:  set-valued function called in context that cannot accept a set

[code]
Select
    Case When (array_upper(dane_array, 1) > 1) Then
        dane_array[1]::text || '-' || dane_array[array_upper(dane_array, 1)]::text
    Else dane_array[1]::text End
From
    (Select string_to_array(split, ',')::int[] As dane_array From 
        (Select regexp_split_to_table(regexp_replace(array_agg(dane.nr_szt)::text, '[{}]', '', 'g'), '(,NULL)+,') As split From dane Right Join
        (Select nr_szt From generate_series((Select min(nr_szt) From dane), (Select max(nr_szt) From dane)) nr_szt) rs On dane.nr_szt = rs.nr_szt) ds
    ) s;
[/code]]]></description>
			<author><![CDATA[dummy@example.com (przesq)]]></author>
			<pubDate>Wed, 15 Feb 2012 18:19:53 +0000</pubDate>
			<guid>https://forum.postgresql.org.pl/viewtopic.php?pid=3444#p3444</guid>
		</item>
		<item>
			<title><![CDATA[Odp: grupy przedziałów]]></title>
			<link>https://forum.postgresql.org.pl/viewtopic.php?pid=3436#p3436</link>
			<description><![CDATA[Wszystko jasne, Common Table Expressions (and Recursive Queries) zostały dodane począwszy od 8.4 ([url]http://www.postgresql.org/docs/8.4/static/release-8-4.html[/url]), coś mi się zdaje, że array_agg podobnie (zgadza się, trzeba utworzyć samodzielnie, patrz [url]http://wiki.postgresql.org/wiki/Array_agg).[/url]. Poniżej to samo, tylko bez With:

[code]Select
    Case When (array_length(dane_array, 1) > 1) Then
        dane_array[1]::text || '-' || dane_array[array_length(dane_array, 1)]::text
    Else dane_array[1]::text End
From
    (Select string_to_array(split, ',')::int[] As dane_array From 
        (Select regexp_split_to_table(regexp_replace(array_agg(dane.nr_szt)::text, '[{}]', '', 'g'), '(,NULL)+,') As split From dane Right Join
        (Select nr_szt From generate_series((Select min(nr_szt) From dane), (Select max(nr_szt) From dane)) nr_szt) rs On dane.nr_szt = rs.nr_szt) ds
    ) s;[/code]]]></description>
			<author><![CDATA[dummy@example.com (gszpetkowski)]]></author>
			<pubDate>Wed, 15 Feb 2012 10:37:09 +0000</pubDate>
			<guid>https://forum.postgresql.org.pl/viewtopic.php?pid=3436#p3436</guid>
		</item>
		<item>
			<title><![CDATA[Odp: grupy przedziałów]]></title>
			<link>https://forum.postgresql.org.pl/viewtopic.php?pid=3435#p3435</link>
			<description><![CDATA[otrzymuję błąd

ERROR:  syntax error at or near "With dane_split"
LINE 1: With dane_split As (
        ^

********** Błąd **********

ERROR: syntax error at or near "With dane_split"
Stan SQL:42601
Znak:1

czy muszę zainstalować jakąś funkcję?
wersja 8.3]]></description>
			<author><![CDATA[dummy@example.com (przesq)]]></author>
			<pubDate>Wed, 15 Feb 2012 08:15:05 +0000</pubDate>
			<guid>https://forum.postgresql.org.pl/viewtopic.php?pid=3435#p3435</guid>
		</item>
		<item>
			<title><![CDATA[Odp: grupy przedziałów]]></title>
			<link>https://forum.postgresql.org.pl/viewtopic.php?pid=3434#p3434</link>
			<description><![CDATA[Szczerze pisząc nie mam pomysłów jak to rozwiązać w prosty sposób, choć nie wykluczam, że taki istnieje i chętnie bym to zobaczył, poniżej moje toporne rozwiązanie, w skrócie prawy join na (dynamicznie) wygenerowaną serię, zrzucenie do tablicy, konwersja i obcięcie na string odzdzielony przecinkami, split oparty o wyrażenie regularne, z powrotem złożenie stringów do już podzielonych tablic i wyciągnięcie krańców przedziałów dla każdej z nich, dzięki użyciu case'a powinno dać się obsługiwać pojedyncze wartości (CTE dodałem dla czytelności, oprócz tego przyjąłem, że bazowa tabela nazywa się dane):

[code]With dane_split As (
    Select regexp_split_to_table(regexp_replace(array_agg(dane.nr_szt)::text, '[{}]', '', 'g'), '(,NULL)+,') As split From dane Right Join
    (Select nr_szt From generate_series((Select min(nr_szt) From dane), (Select max(nr_szt) From dane)) nr_szt) s On dane.nr_szt = s.nr_szt)
Select
    Case When (array_length(dane_array, 1) > 1) Then
        dane_array[1]::text || '-' || dane_array[array_length(dane_array, 1)]::text
    Else dane_array[1]::text End
From (Select string_to_array(split, ',')::int[] As dane_array From dane_split) s;[/code]

Wynik:

[code] dane_array 
------------
 1-4
 9-12
 20-25
(3 rows)[/code]

Druga możliwość jaką widzę, to użycie języka proceduralnego np. PL/pgSQL, ale tam też trzeba się trochę napisać.]]></description>
			<author><![CDATA[dummy@example.com (gszpetkowski)]]></author>
			<pubDate>Tue, 14 Feb 2012 22:19:27 +0000</pubDate>
			<guid>https://forum.postgresql.org.pl/viewtopic.php?pid=3434#p3434</guid>
		</item>
		<item>
			<title><![CDATA[grupy przedziałów]]></title>
			<link>https://forum.postgresql.org.pl/viewtopic.php?pid=3428#p3428</link>
			<description><![CDATA[Mam w tabeli pole nr_szt, dane są typu int. Mam przykładowe dane, które nie zawsze są jeden za drugim typu 1,2,3.....50:

1,2,3,4,9,10,11,12,20,21,22,23,24,25

Potrzebuję stworzyć zapytanie, tak aby otrzymać nr sztuk od do - w tym przypadku wynik powinien być następujący:
1-4,9-12,20-25

to jak pobrać pierwszy czy ostatni to wiem, ale z przedziałami to już nie wiem.]]></description>
			<author><![CDATA[dummy@example.com (przesq)]]></author>
			<pubDate>Tue, 14 Feb 2012 12:30:08 +0000</pubDate>
			<guid>https://forum.postgresql.org.pl/viewtopic.php?pid=3428#p3428</guid>
		</item>
	</channel>
</rss>
