| 435 |
435 |
for w, h, n in hr]} |
| 436 |
436 |
|
| 437 |
437 |
# ----- tableaux -------------------------------------------------------- |
|
438 |
+ # une seule passe agrégée sur les produits des 50 boutiques (les |
|
439 |
+ # sous-requêtes corrélées balayaient les 3 900+ boutiques : > 2 min |
|
440 |
+ # sur la DB de 1,9 Go) |
| 438 |
441 |
shop_rows = con.execute(""" |
| 439 |
|
− SELECT s.name, s.region, s.product_count, |
| 440 |
|
− (SELECT COUNT(*) FROM products p WHERE p.store_id=s.id |
| 441 |
|
− AND p.first_seen>=? AND p.first_seen<?) AS nouv, |
| 442 |
|
− (SELECT ROUND(AVG(p.price),2) FROM products p |
| 443 |
|
− WHERE p.store_id=s.id AND p.active=1 AND p.listing_status='published' AND p.price>0 |
| 444 |
|
− AND p.price<=?) AS pavg |
| 445 |
|
− FROM stores s WHERE s.product_count>0 |
| 446 |
|
− ORDER BY s.product_count DESC LIMIT 50""", (t0, t1, PRICE_CAP)).fetchall() |
|
442 |
+ WITH top AS (SELECT id, name, region, product_count FROM stores |
|
443 |
+ WHERE product_count>0 |
|
444 |
+ ORDER BY product_count DESC LIMIT 50) |
|
445 |
+ SELECT t.name, t.region, t.product_count, |
|
446 |
+ COALESCE(a.nouv, 0) AS nouv, a.pavg |
|
447 |
+ FROM top t LEFT JOIN ( |
|
448 |
+ SELECT store_id, |
|
449 |
+ SUM(CASE WHEN first_seen>=? AND first_seen<? |
|
450 |
+ THEN 1 ELSE 0 END) AS nouv, |
|
451 |
+ ROUND(AVG(CASE WHEN active=1 |
|
452 |
+ AND listing_status='published' |
|
453 |
+ AND price>0 AND price<=? |
|
454 |
+ THEN price END), 2) AS pavg |
|
455 |
+ FROM products WHERE store_id IN (SELECT id FROM top) |
|
456 |
+ GROUP BY store_id) a ON a.store_id=t.id |
|
457 |
+ ORDER BY t.product_count DESC""", (t0, t1, PRICE_CAP)).fetchall() |
| 447 |
458 |
cat_rows = con.execute(""" |
| 448 |
459 |
SELECT category, COUNT(*) AS n, COUNT(DISTINCT store_id) AS st, |
| 449 |
460 |
ROUND(AVG(CASE WHEN price>0 AND price<=? THEN price END),2) |
| 450 |
461 |
|