PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Wie kann man die beiden Abfragen mit einer with-Klausel natürlich verbinden?

Du verkomplizierst die Dinge zu sehr. Sie müssen sich diesen beiden Abfragen nicht anschließen (und sollten sich wirklich von einem natürlichen fernhalten verbinden), müssen Sie sie nur kombinieren. min() und max() innerhalb derselben Abfrage verwendet werden können, müssen nicht zwei Abfragen ausgeführt werden, um beide auszuwerten.

Sie müssen CTE-Definitionen auch nicht verschachteln, Sie können einfach eine nach der anderen schreiben.

Also etwa so:

with quant_table as (
  select month, prod, sum(quant) as sum_q
  from sales 
  group by month, prod
), min_max as (
  select month, max(sum_q) as max_q, min(sum_q) as min_q
  from quant_table 
  group by month 
)
select t1.* 
from quant_table t1
  join min_max t2 
    on t2.month = t1.month 
   and t1.sum_q in (t2.min_q, t2.max_q)
order by month, prod;

Die Bedingung and t1.sum_q in (t2.min_q, t2.max_q) könnte auch geschrieben werden als and (t2.max_q = t1.sum_q or t2.min_q = t1.sum_q) .

Das obige kann weiter vereinfacht werden, indem group by kombiniert wird mit Fensterfunktionen und führen Sie die Berechnung der Summe, des Minimums und des Maximums in einer einzigen Abfrage durch:

with min_max as (
  select month, prod, 
         sum(quant) as sum_q,
         max(sum(quant)) over (partition by month) as max_q,
         min(sum(quant)) over (partition by month) as min_q
  from sales 
  group by month, prod
)
select month, prod, sum_q
from min_max
where sum_q in (max_q, min_q)
order by month, prod;