WITH latest_profile AS (
|
SELECT MAX(snapshot_date) AS snapshot_date
|
FROM a_share_profile_snapshot
|
WHERE snapshot_date <= '2026-07-04'
|
),
|
universe AS (
|
SELECT
|
p.symbol,
|
p.stock_name,
|
p.industry_l1,
|
p.industry_l2,
|
p.concepts_raw,
|
p.main_business_raw
|
FROM a_share_profile_snapshot p
|
JOIN latest_profile lp ON lp.snapshot_date = p.snapshot_date
|
WHERE p.status = 'OK'
|
AND ((p.industry_l1 LIKE '%机器人%' ESCAPE '\\' OR p.industry_l2 LIKE '%机器人%' ESCAPE '\\' OR p.concepts_raw LIKE '%机器人%' ESCAPE '\\' OR p.main_business_raw LIKE '%机器人%' ESCAPE '\\' OR p.stock_name LIKE '%机器人%' ESCAPE '\\') OR (p.industry_l1 LIKE '%人形机器人%' ESCAPE '\\' OR p.industry_l2 LIKE '%人形机器人%' ESCAPE '\\' OR p.concepts_raw LIKE '%人形机器人%' ESCAPE '\\' OR p.main_business_raw LIKE '%人形机器人%' ESCAPE '\\' OR p.stock_name LIKE '%人形机器人%' ESCAPE '\\') OR (p.industry_l1 LIKE '%工业机器人%' ESCAPE '\\' OR p.industry_l2 LIKE '%工业机器人%' ESCAPE '\\' OR p.concepts_raw LIKE '%工业机器人%' ESCAPE '\\' OR p.main_business_raw LIKE '%工业机器人%' ESCAPE '\\' OR p.stock_name LIKE '%工业机器人%' ESCAPE '\\') OR (p.industry_l1 LIKE '%机器视觉%' ESCAPE '\\' OR p.industry_l2 LIKE '%机器视觉%' ESCAPE '\\' OR p.concepts_raw LIKE '%机器视觉%' ESCAPE '\\' OR p.main_business_raw LIKE '%机器视觉%' ESCAPE '\\' OR p.stock_name LIKE '%机器视觉%' ESCAPE '\\') OR (p.industry_l1 LIKE '%减速器%' ESCAPE '\\' OR p.industry_l2 LIKE '%减速器%' ESCAPE '\\' OR p.concepts_raw LIKE '%减速器%' ESCAPE '\\' OR p.main_business_raw LIKE '%减速器%' ESCAPE '\\' OR p.stock_name LIKE '%减速器%' ESCAPE '\\') OR (p.industry_l1 LIKE '%伺服%' ESCAPE '\\' OR p.industry_l2 LIKE '%伺服%' ESCAPE '\\' OR p.concepts_raw LIKE '%伺服%' ESCAPE '\\' OR p.main_business_raw LIKE '%伺服%' ESCAPE '\\' OR p.stock_name LIKE '%伺服%' ESCAPE '\\') OR (p.industry_l1 LIKE '%丝杠%' ESCAPE '\\' OR p.industry_l2 LIKE '%丝杠%' ESCAPE '\\' OR p.concepts_raw LIKE '%丝杠%' ESCAPE '\\' OR p.main_business_raw LIKE '%丝杠%' ESCAPE '\\' OR p.stock_name LIKE '%丝杠%' ESCAPE '\\') OR (p.industry_l1 LIKE '%灵巧手%' ESCAPE '\\' OR p.industry_l2 LIKE '%灵巧手%' ESCAPE '\\' OR p.concepts_raw LIKE '%灵巧手%' ESCAPE '\\' OR p.main_business_raw LIKE '%灵巧手%' ESCAPE '\\' OR p.stock_name LIKE '%灵巧手%' ESCAPE '\\') OR (p.industry_l1 LIKE '%传感器%' ESCAPE '\\' OR p.industry_l2 LIKE '%传感器%' ESCAPE '\\' OR p.concepts_raw LIKE '%传感器%' ESCAPE '\\' OR p.main_business_raw LIKE '%传感器%' ESCAPE '\\' OR p.stock_name LIKE '%传感器%' ESCAPE '\\') OR (p.industry_l1 LIKE '%具身智能%' ESCAPE '\\' OR p.industry_l2 LIKE '%具身智能%' ESCAPE '\\' OR p.concepts_raw LIKE '%具身智能%' ESCAPE '\\' OR p.main_business_raw LIKE '%具身智能%' ESCAPE '\\' OR p.stock_name LIKE '%具身智能%' ESCAPE '\\'))
|
),
|
price_with_prev AS (
|
SELECT
|
d.symbol,
|
d.trade_date,
|
d.open_price,
|
d.high_price,
|
d.low_price,
|
d.close_price,
|
d.volume,
|
d.amount,
|
LAG(d.close_price) OVER (PARTITION BY d.symbol ORDER BY d.trade_date) AS prev_close,
|
AVG(d.amount) OVER (
|
PARTITION BY d.symbol
|
ORDER BY d.trade_date
|
ROWS BETWEEN 20 PRECEDING AND 1 PRECEDING
|
) AS avg_amount_20
|
FROM a_share_daily_price d
|
JOIN universe u ON u.symbol = d.symbol
|
WHERE d.trade_date BETWEEN DATE_SUB('2026-04-04', INTERVAL 30 DAY) AND '2026-07-04'
|
),
|
window_rows AS (
|
SELECT
|
u.stock_name,
|
u.industry_l1,
|
u.industry_l2,
|
u.concepts_raw,
|
u.main_business_raw,
|
p.*,
|
CASE
|
WHEN p.prev_close IS NULL OR p.prev_close = 0 THEN NULL
|
ELSE (p.close_price / p.prev_close - 1) * 100
|
END AS daily_return_pct,
|
CASE
|
WHEN p.avg_amount_20 IS NULL OR p.avg_amount_20 = 0 THEN NULL
|
ELSE p.amount / p.avg_amount_20
|
END AS amount_ratio_20
|
FROM price_with_prev p
|
JOIN universe u ON u.symbol = p.symbol
|
WHERE p.trade_date BETWEEN '2026-04-04' AND '2026-07-04'
|
),
|
ranked AS (
|
SELECT
|
w.*,
|
ROW_NUMBER() OVER (PARTITION BY w.symbol ORDER BY w.trade_date) AS rn_first,
|
ROW_NUMBER() OVER (PARTITION BY w.symbol ORDER BY w.trade_date DESC) AS rn_last
|
FROM window_rows w
|
),
|
agg AS (
|
SELECT
|
symbol,
|
MAX(stock_name) AS company_name,
|
MAX(industry_l1) AS industry_l1,
|
MAX(industry_l2) AS industry_l2,
|
MAX(concepts_raw) AS concepts_raw,
|
MAX(main_business_raw) AS main_business_raw,
|
MIN(trade_date) AS window_start,
|
MAX(trade_date) AS window_end,
|
MAX(CASE WHEN rn_first = 1 THEN close_price END) AS first_close,
|
MAX(CASE WHEN rn_last = 1 THEN close_price END) AS last_close,
|
COUNT(*) AS trading_days,
|
SUM(CASE WHEN daily_return_pct >= 9.5 THEN 1 ELSE 0 END) AS strong_up_days,
|
MAX(daily_return_pct) AS max_daily_return_pct,
|
MAX(amount_ratio_20) AS max_amount_ratio_20,
|
MAX(amount) AS max_amount
|
FROM ranked
|
GROUP BY symbol
|
),
|
scored AS (
|
SELECT
|
*,
|
CASE
|
WHEN first_close IS NULL OR first_close = 0 THEN NULL
|
ELSE (last_close / first_close - 1) * 100
|
END AS period_return_pct
|
FROM agg
|
)
|
SELECT
|
'SCAN-ANA-ROBOT-MARKET-GAP-20260704-001' AS scan_id,
|
'机器人案例' AS industry_case,
|
symbol,
|
company_name,
|
industry_l1,
|
industry_l2,
|
window_start,
|
window_end,
|
trading_days,
|
ROUND(first_close, 4) AS first_close,
|
ROUND(last_close, 4) AS last_close,
|
ROUND(period_return_pct, 4) AS period_return_pct,
|
strong_up_days,
|
ROUND(max_daily_return_pct, 4) AS max_daily_return_pct,
|
ROUND(max_amount_ratio_20, 4) AS max_amount_ratio_20,
|
CASE
|
WHEN period_return_pct >= 20.0 OR strong_up_days >= 1 OR max_amount_ratio_20 >= 2.0
|
THEN 'STRONG_MANIFESTATION'
|
ELSE 'WEAK_OR_NORMAL'
|
END AS manifestation_type,
|
'REVIEW_REQUIRED' AS scope_type,
|
'REVIEW_REQUIRED' AS suspected_missing_track,
|
'MARKET_REVERSE_GAP_SCAN' AS gap_type,
|
CASE
|
WHEN period_return_pct >= 20.0 OR strong_up_days >= 1 OR max_amount_ratio_20 >= 2.0
|
THEN 1
|
ELSE 0
|
END AS supplement_required_flag,
|
'Review core business against industry scheme before adding to evidence queue' AS supplement_question,
|
'DRAFT_FOR_REVIEW' AS review_status,
|
LEFT(concepts_raw, 500) AS concepts_excerpt,
|
LEFT(main_business_raw, 500) AS main_business_excerpt
|
FROM scored
|
WHERE period_return_pct >= 20.0
|
OR strong_up_days >= 1
|
OR max_amount_ratio_20 >= 2.0
|
ORDER BY supplement_required_flag DESC, period_return_pct DESC, strong_up_days DESC, max_amount_ratio_20 DESC;
|