V10.535 優化 ElephantAlpha 價格 trigger 查詢

This commit is contained in:
OoO
2026-06-01 02:21:56 +08:00
committed by AiderHeal Bot
parent 2a11ba26a7
commit 5e1428c887
6 changed files with 136 additions and 52 deletions

View File

@@ -393,23 +393,46 @@ class ElephantAlphaAutonomousEngine:
rows = session.execute(
text("""
SELECT p.i_code AS sku, p.name, p.category,
cp.price AS competitor_price, pr.price AS momo_price,
((pr.price - cp.price) / NULLIF(pr.price, 0) * 100) AS price_gap_pct,
cp.competitor_price, pr.momo_price,
((pr.momo_price - cp.competitor_price) / NULLIF(pr.momo_price, 0) * 100) AS price_gap_pct,
cp.competitor_product_id,
cp.competitor_product_name,
cp.match_score,
cp.tags,
cp.match_diagnostic_json,
cp.crawled_at
FROM products p
JOIN (
SELECT DISTINCT ON (product_id) product_id, price
FROM price_records
ORDER BY product_id, timestamp DESC
) pr ON pr.product_id = p.id
JOIN competitor_prices cp ON cp.sku = p.i_code
WHERE cp.expires_at > NOW()
AND COALESCE(cp.match_score, 0) >= 0.76
AND COALESCE(cp.tags, '[]'::jsonb) ? 'identity_v2'
AND cp.price < pr.price * 0.85
AND cp.crawled_at >= NOW() - INTERVAL '2 hours'
FROM (
SELECT cp.sku,
cp.price AS competitor_price,
cp.competitor_product_id,
cp.competitor_product_name,
cp.match_score,
cp.tags,
cp.match_diagnostic_json,
cp.crawled_at
FROM competitor_prices cp
WHERE cp.source = 'pchome'
AND (cp.expires_at IS NULL OR cp.expires_at > NOW())
AND cp.price IS NOT NULL
AND cp.price > 0
AND cp.crawled_at >= NOW() - INTERVAL '2 hours'
AND COALESCE(cp.match_score, 0) >= 0.76
AND COALESCE(cp.tags, '[]'::jsonb) ? 'identity_v2'
) cp
JOIN products p ON p.i_code = cp.sku
JOIN LATERAL (
SELECT pr.price AS momo_price
FROM price_records pr
WHERE pr.product_id = p.id
AND pr.price IS NOT NULL
AND pr.price > 0
ORDER BY pr.timestamp DESC, pr.id DESC
LIMIT 1
) pr ON TRUE
WHERE p.status = 'ACTIVE'
AND cp.competitor_price < pr.momo_price * 0.85
ORDER BY ((pr.momo_price - cp.competitor_price) / NULLIF(pr.momo_price, 0)) DESC NULLS LAST,
cp.crawled_at DESC NULLS LAST
LIMIT 10
""")
).mappings().fetchall()
@@ -430,23 +453,46 @@ class ElephantAlphaAutonomousEngine:
rows = session.execute(
text("""
SELECT p.i_code AS sku, p.name, p.category,
cp.price AS competitor_price, pr.price AS momo_price,
((pr.price - cp.price) / NULLIF(pr.price, 0) * 100) AS price_gap_pct,
cp.competitor_price, pr.momo_price,
((pr.momo_price - cp.competitor_price) / NULLIF(pr.momo_price, 0) * 100) AS price_gap_pct,
cp.competitor_product_id,
cp.competitor_product_name,
cp.match_score,
cp.tags,
cp.match_diagnostic_json,
cp.crawled_at
FROM products p
JOIN (
SELECT DISTINCT ON (product_id) product_id, price
FROM price_records
ORDER BY product_id, timestamp DESC
) pr ON pr.product_id = p.id
JOIN competitor_prices cp ON cp.sku = p.i_code
WHERE cp.expires_at > NOW()
AND COALESCE(cp.match_score, 0) >= 0.76
AND COALESCE(cp.tags, '[]'::jsonb) ? 'identity_v2'
AND cp.price > pr.price * 1.05
AND cp.crawled_at >= NOW() - INTERVAL '1 hour'
FROM (
SELECT cp.sku,
cp.price AS competitor_price,
cp.competitor_product_id,
cp.competitor_product_name,
cp.match_score,
cp.tags,
cp.match_diagnostic_json,
cp.crawled_at
FROM competitor_prices cp
WHERE cp.source = 'pchome'
AND (cp.expires_at IS NULL OR cp.expires_at > NOW())
AND cp.price IS NOT NULL
AND cp.price > 0
AND cp.crawled_at >= NOW() - INTERVAL '1 hour'
AND COALESCE(cp.match_score, 0) >= 0.76
AND COALESCE(cp.tags, '[]'::jsonb) ? 'identity_v2'
) cp
JOIN products p ON p.i_code = cp.sku
JOIN LATERAL (
SELECT pr.price AS momo_price
FROM price_records pr
WHERE pr.product_id = p.id
AND pr.price IS NOT NULL
AND pr.price > 0
ORDER BY pr.timestamp DESC, pr.id DESC
LIMIT 1
) pr ON TRUE
WHERE p.status = 'ACTIVE'
AND cp.competitor_price > pr.momo_price * 1.05
ORDER BY ((cp.competitor_price - pr.momo_price) / NULLIF(pr.momo_price, 0)) DESC NULLS LAST,
cp.crawled_at DESC NULLS LAST
LIMIT 5
""")
).mappings().fetchall()
@@ -1468,21 +1514,7 @@ class ElephantAlphaAutonomousEngine:
try:
rows = session.execute(
text("""
WITH latest_momo AS (
SELECT DISTINCT ON (p.i_code)
p.i_code AS sku,
p.name,
p.category,
pr.price AS momo_price,
pr.timestamp
FROM products p
JOIN price_records pr ON pr.product_id = p.id
WHERE p.status = 'ACTIVE'
AND pr.price IS NOT NULL
AND pr.price > 0
ORDER BY p.i_code, pr.timestamp DESC, pr.id DESC
),
latest_competitor AS (
WITH latest_competitor AS (
SELECT DISTINCT ON (cp.sku)
cp.sku,
cp.price AS competitor_price,
@@ -1502,21 +1534,33 @@ class ElephantAlphaAutonomousEngine:
AND cp.crawled_at >= NOW() - INTERVAL '2 hours'
ORDER BY cp.sku, cp.crawled_at DESC NULLS LAST
)
SELECT lm.sku, lm.name, lm.category,
lm.momo_price,
SELECT p.i_code AS sku, p.name, p.category,
pr.momo_price,
lc.competitor_price,
((lm.momo_price - lc.competitor_price) / NULLIF(lm.momo_price, 0) * 100) AS price_gap_pct,
((pr.momo_price - lc.competitor_price) / NULLIF(pr.momo_price, 0) * 100) AS price_gap_pct,
lc.competitor_product_id,
lc.competitor_product_name,
lc.match_score,
lc.tags,
lc.match_diagnostic_json,
lc.crawled_at
FROM latest_momo lm
JOIN latest_competitor lc ON lc.sku = lm.sku
WHERE lc.competitor_price < lm.momo_price * 0.85
OR lc.competitor_price > lm.momo_price * 1.05
ORDER BY ABS((lm.momo_price - lc.competitor_price) / NULLIF(lm.momo_price, 0)) DESC NULLS LAST,
FROM latest_competitor lc
JOIN products p ON p.i_code = lc.sku
JOIN LATERAL (
SELECT pr.price AS momo_price
FROM price_records pr
WHERE pr.product_id = p.id
AND pr.price IS NOT NULL
AND pr.price > 0
ORDER BY pr.timestamp DESC, pr.id DESC
LIMIT 1
) pr ON TRUE
WHERE p.status = 'ACTIVE'
AND (
lc.competitor_price < pr.momo_price * 0.85
OR lc.competitor_price > pr.momo_price * 1.05
)
ORDER BY ABS((pr.momo_price - lc.competitor_price) / NULLIF(pr.momo_price, 0)) DESC NULLS LAST,
lc.crawled_at DESC NULLS LAST
LIMIT :limit
"""),