<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
	<title type="html"><![CDATA[Forum PostgreSQL - grupy przedziałów]]></title>
	<link rel="self" href="http://forum.postgresql.org.pl/extern.php?action=feed&amp;tid=1225&amp;type=atom"/>
	<updated>2012-02-15T22:17:20Z</updated>
	<generator>PunBB</generator>
	<id>https://forum.postgresql.org.pl/viewtopic.php?id=1225</id>
		<entry>
			<title type="html"><![CDATA[Odp: grupy przedziałów]]></title>
			<link rel="alternate" href="https://forum.postgresql.org.pl/viewtopic.php?pid=3445#p3445"/>
			<content type="html"><![CDATA[Użyj zamiast tego array_upper, jako drugi parametr także jedynka.]]></content>
			<author>
				<name><![CDATA[gszpetkowski]]></name>
				<uri>https://forum.postgresql.org.pl/profile.php?id=1223</uri>
			</author>
			<updated>2012-02-15T22:17:20Z</updated>
			<id>https://forum.postgresql.org.pl/viewtopic.php?pid=3445#p3445</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Odp: grupy przedziałów]]></title>
			<link rel="alternate" href="https://forum.postgresql.org.pl/viewtopic.php?pid=3444#p3444"/>
			<content type="html"><![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]]]></content>
			<author>
				<name><![CDATA[przesq]]></name>
				<uri>https://forum.postgresql.org.pl/profile.php?id=1211</uri>
			</author>
			<updated>2012-02-15T18:19:53Z</updated>
			<id>https://forum.postgresql.org.pl/viewtopic.php?pid=3444#p3444</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Odp: grupy przedziałów]]></title>
			<link rel="alternate" href="https://forum.postgresql.org.pl/viewtopic.php?pid=3436#p3436"/>
			<content type="html"><![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]]]></content>
			<author>
				<name><![CDATA[gszpetkowski]]></name>
				<uri>https://forum.postgresql.org.pl/profile.php?id=1223</uri>
			</author>
			<updated>2012-02-15T10:37:09Z</updated>
			<id>https://forum.postgresql.org.pl/viewtopic.php?pid=3436#p3436</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Odp: grupy przedziałów]]></title>
			<link rel="alternate" href="https://forum.postgresql.org.pl/viewtopic.php?pid=3435#p3435"/>
			<content type="html"><![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]]></content>
			<author>
				<name><![CDATA[przesq]]></name>
				<uri>https://forum.postgresql.org.pl/profile.php?id=1211</uri>
			</author>
			<updated>2012-02-15T08:15:05Z</updated>
			<id>https://forum.postgresql.org.pl/viewtopic.php?pid=3435#p3435</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Odp: grupy przedziałów]]></title>
			<link rel="alternate" href="https://forum.postgresql.org.pl/viewtopic.php?pid=3434#p3434"/>
			<content type="html"><![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ć.]]></content>
			<author>
				<name><![CDATA[gszpetkowski]]></name>
				<uri>https://forum.postgresql.org.pl/profile.php?id=1223</uri>
			</author>
			<updated>2012-02-14T22:19:27Z</updated>
			<id>https://forum.postgresql.org.pl/viewtopic.php?pid=3434#p3434</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[grupy przedziałów]]></title>
			<link rel="alternate" href="https://forum.postgresql.org.pl/viewtopic.php?pid=3428#p3428"/>
			<content type="html"><![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.]]></content>
			<author>
				<name><![CDATA[przesq]]></name>
				<uri>https://forum.postgresql.org.pl/profile.php?id=1211</uri>
			</author>
			<updated>2012-02-14T12:30:08Z</updated>
			<id>https://forum.postgresql.org.pl/viewtopic.php?pid=3428#p3428</id>
		</entry>
</feed>
