V10.535 優化 ElephantAlpha 價格 trigger 查詢
This commit is contained in:
@@ -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
|
||||
"""),
|
||||
|
||||
Reference in New Issue
Block a user