2017-10-01 14 views
1

J'essaie de prendre des sous-ensembles à partir de colonnes compartimentées, puis de prendre l'intersection.Intersection N width_buckets

Cela sélectionnera d'autres colonnes de la table d'origine.

Je suis également ouvert au filtrage en série.

Le code ci-dessous rapports col1 n'existe pas - pas sûr C'est l'approche correcte de toute façon.

WITH ranges AS (
    SELECT 
    min(col1) AS c1min, 
    max(col1) AS c1max, 
    min(col2) AS c2min, 
    max(col2) AS c2max 
    FROM csv_test 
), 
f1 AS (
    SELECT width_bucket(col1,c1min,c1max,12) AS b1 
    FROM csv_test, ranges 
    ORDER BY b1 ASC 
), 
f2 AS (
    SELECT width_bucket(col2,c2min,c2max,12) AS b2 
    FROM csv_test, ranges 
    ORDER BY b2 ASC 
) 
SELECT b1, b2, c3, c4, c18 
FROM csv_test 
WHERE 
b1 BETWEEN 0 AND 5 
AND 
b2 BETWEEN 3 AND 7; 
+1

Voulez-vous quelque chose comme ** [Demo] (http://dbfiddle.uk/?rdbms=postgres_9. 6 & violon = 1ea8a68f0e5fb8eb8db2f98979409bd1) **? – lad2025

+1

C'est parfait. Les jointures LATERAL étaient ce dont j'avais besoin. Je vous remercie. –

Répondre

1

Vous pouvez utiliser LATERAL rejoindre:

SELECT t.*, s2.* 
FROM csv_test t 
,LATERAL (SELECT 
      min(col1) AS c1min, 
      max(col1) AS c1max, 
      min(col2) AS c2min, 
      max(col2) AS c2max 
      FROM csv_test) AS s 
,LATERAL (SELECT width_bucket(col1,c1min,c1max,12) AS b1, 
       width_bucket(col2,c2min,c2max,12) AS b2) AS s2 
WHERE b1 BETWEEN 0 AND 5 
    AND b2 BETWEEN 3 AND 7; 

DBFiddle Demo