2015-09-02 18 views
8
CREATE TABLE entries (
    id serial NOT NULL, 
    title character varying, 
    load_sequence integer 
); 

ve veri GRUP girdileri kesintisiz olarak nasıl sıralanır?

INSERT INTO entries(title, load_sequence) VALUES ('A', 1); 
INSERT INTO entries(title, load_sequence) VALUES ('A', 2); 
INSERT INTO entries(title, load_sequence) VALUES ('A', 3); 

INSERT INTO entries(title, load_sequence) VALUES ('A', 6); 

INSERT INTO entries(title, load_sequence) VALUES ('B', 4); 
INSERT INTO entries(title, load_sequence) VALUES ('B', 5); 

INSERT INTO entries(title, load_sequence) VALUES ('B', 7); 
INSERT INTO entries(title, load_sequence) VALUES ('B', 8); 

SQL yazmak için PostgreSQL bir yolu var mı olduğunu load_sequence bunları sipariş sonra aynı title kesimleri tarafından gruplar verileri.

=# SELECT id, title, load_sequence FROM entries ORDER BY load_sequence; 
id | title | load_sequence 
----+-------+--------------- 
    9 | A  |    1 
10 | A  |    2 
11 | A  |    3 
13 | B  |    4 
14 | B  |    5 
12 | A  |    6 
15 | B  |    7 
16 | B  |    8 

VE ben grup istiyorum: Yani

=# SELECT title, string_agg(id::text, ',' ORDER BY id) FROM entries ???????????; 

yüzden olacağını sonucu:

SELECT title, string_agg(id::text, ',' ORDER BY id) 
FROM (
    SELECT id, title, 
     ROW_NUMBER() OVER (ORDER BY load_sequence) - 
     ROW_NUMBER() OVER (PARTITION BY title 
          ORDER BY load_sequence) AS grp 
    FROM entries) AS t 
GROUP BY title, grp 

Hesaplanan:

title | string_agg 
-------+------------- 
A  | 9,10,11 
B  | 13,14 
A  | 12 
B  | 15,16 
+1

Ne yazık ki bu gibi sorular tabloyu oluşturma komut dosyaları ve örnek verileri ayarlayan runnable 'INSERT' ifadelerini içeren nadirdir. +1 benden. –

cevap

4

Aşağıdaki sorguyu kullanabilirsiniz grp alanı, ardışık load_sequence değerlerine sahip title kayıtlarının dilimlerini tanımlamaya yarar. Bu alanı GROUP BY maddesinde kullanarak, id değerleri üzerinde gerekli kümelenmeyi başarabiliriz.

Demo here

+0

Teşekkür ederim, fikrim var. Benim özel durumum için küçük değişiklikler ile sonunda çalışır. – oskarae

0

Bunun için bir lag ged pencere üzerinde çalışan bir pencere fonksiyonu olarak sum ile kullanabileceğiniz bir hile var.

fikri aksi takdirde sen lag pencere fonksiyonu kullanılarak süreksizliklerin tespit 0 döndürür, bir kenar/süreksizliği vurduğunda sen 1 dönmek olmasıdır.

SELECT title, string_agg(id::text, ', ') FROM (
    SELECT 
    id, title, load_sequence, 
    sum(title_changed) OVER (ORDER BY load_sequence) AS partition_no 
    FROM (
    SELECT 
     id, title, load_sequence, 
     CASE WHEN title = lag(title, 1) OVER (ORDER BY load_sequence) THEN 0 ELSE 1 END AS title_changed FROM entries 
) x 
) y 
GROUP BY partition_no, title;