RE: search inside partitions

Olivier Leprêtre <[email protected]>
Newsgroups gmane.comp.db.postgresql.sql
Message-ID <[email protected]>
Thanks very much Torsten, it works like a charm. I was not used to recursive functions, that's a good beginning...

 

Nice week-end to all 

 

De : Torsten Grust [mailto:[email protected]] 
Envoyé : vendredi 2 février 2018 12:20
À : [email protected]
Objet : Re: search inside partitions

 

 

Hi Olivier,

since this is some sort of "pointer chasing" through the table, I guess a recursive SQL function can do the trick.

See the SQL code below which it appears to do the job (modulo any false interpretation of your problem statement).

Cheers,

—Torsten

 

DROP TABLE IF EXISTS t;
CREATE TABLE t (
  a INT NOT NULL,
  b INT NOT NULL);
 
INSERT INTO t(a,b) VALUES
  (   298, 151208),
  (151208, 151209),
  (151210,   2000),
  (  2000, 151211),
  (  2004, 151213),
  (  2004,   2013),
  ( 27601, 151214),
  (151214, 151215),
  (151212, 151213),
  (  2016,   2018),
  (151215,   2016),
  (  2018,   2019),
  (  2019,   2020),
  (  2020, 151217),
  (151217, 151218),
  (  2026,   2028),
  ( 33753,   2026),
  (  2013,  27601),
  (151218, 151219),
  (151219,  33753),
  (151209, 151210),
  (151211, 151212);
 
WITH RECURSIVE chase(a, b, pos) AS (
  SELECT t.a, t.b, 1 AS pos
  FROM   T AS t
  WHERE  t.a = 298  -- identifies the "first row" in the input
 
    UNION ALL
 
  SELECT CASE WHEN c.b = t.a THEN t.a ELSE t.b END AS a,
         CASE WHEN c.b = t.a THEN t.b ELSE t.a END AS b,
         c.pos + 1 AS pos
  FROM   chase AS c, T AS t
  WHERE  (c.b = t.a AND c.a <> t.b) OR (c.b = t.b AND c.a <> t.a)
)
TABLE chase;

 

On Fri, Feb 2, 2018 at 10:00 AM Olivier Leprêtre <[email protected]> wrote:

Hi to all,

 

I have a table, from which I can extract partitions which need to be ordered, one after the other. A partition is composed of 2 columns A and B and ordering is done by finding the next value of B in another row of the partition.

 

Here are the two columns of one of the partitions :

 


298

151208


151208

151209


151210

2000


2000

151211


2004

151213


2004

2013


27601

151214


151214

151215


151212

151213


2016

2018


151215

2016


2018

2019


2019

2020


2020

151217


151217

151218


2026

2028


33753

2026


2013

27601


151218

151219


151219

33753


151209

151210


151211

151212

 

Starting from the first row the goal is to find the same value in previous of following rows, column A or B.

Example : starting from row 1, 15208 returns row 2 15208-15209, 15209 returns row 15209-15210, 15210 returns 15210-2000 and so on. When the next row is find, a third column C is incremented to be used for sorting

image001.png

 

results should then be


298

151208

1


151208

151209

2


151209

151210

3


151210

2000

4


2000

151211

5


151211

151212

6


151212

151213

7


151213

2004

8


2004

2013

9


2013

27601

10


27601

151214

11


151214

151215

12


151215

2016

13


2016

2018

14


2018

2019

15


2019

2020

16


2020

151217

17


151217

151218

18


151218

151219

19


151219

33753

20


33753

2026

21


2026

2028

22

 

By the way, switching has to be done to have always previous B -> next A but this is less important as it can be done using tricks like putting a minus sign when required and switching afterwards.

 

I'm wondering if there is a rather simple way to do that using partition functions or if I should better try do that using C#

 

Thanks for any idea,

 

Olivier

 

 


 <https://www.avast.com/sig-email?utm_medium=email&utm_source=link&utm_campaign=sig-email&utm_content=emailclient> 

Garanti sans virus.  <https://www.avast.com/sig-email?utm_medium=email&utm_source=link&utm_campaign=sig-email&utm_content=emailclient> www.avast.com 

-- 

| Prof. Dr. Torsten Grust

| Database Systems — Universität Tübingen (Germany)

| ✉︎ [email protected]

| db.inf.uni-tuebingen.de

-- 

| Prof. Dr. Torsten Grust

| Database Systems — Universität Tübingen (Germany)

| ✉︎ [email protected]

| db.inf.uni-tuebingen.de



---
L'absence de virus dans ce courrier électronique a été vérifiée par le logiciel antivirus Avast.
https://www.avast.com/antivirus
image001.png (image/png, 56.8 KB) - not displayed
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.