diff --git a/lastleg-service/src/main/java/com/baiyue/lastleg/selfoperated/analytics/query/AnalyticsReadSql.java b/lastleg-service/src/main/java/com/baiyue/lastleg/selfoperated/analytics/query/AnalyticsReadSql.java index 05ac48fb3..773bbbf8e 100644 --- a/lastleg-service/src/main/java/com/baiyue/lastleg/selfoperated/analytics/query/AnalyticsReadSql.java +++ b/lastleg-service/src/main/java/com/baiyue/lastleg/selfoperated/analytics/query/AnalyticsReadSql.java @@ -35,10 +35,9 @@ public final class AnalyticsReadSql { String localEvidence="CONVERT_TZ(evidence_at_utc,'+00:00','+08:00')"; String observedStart="CONVERT_TZ(GREATEST(evidence_at_utc,#{p.coveredFrom}),'+00:00','+08:00')"; String observedEnd="CONVERT_TZ(#{p.coveredUntil},'+00:00','+08:00')"; - // Candidate identity is already unique. DISTINCT preserves that identity while - // preventing MySQL from merging these per-SKU date calculations into every fact row. - String boundaryProjection="SUMMARY".equals(kind)?"SELECT DISTINCT evidence.*,":"SELECT evidence.*,"; - String sql=candidates("SUMMARY".equals(kind))+" bounds AS ("+boundaryProjection + // Candidate identity is already unique; SUMMARY materializes bounds with NO_MERGE + // at its consumer, avoiding a redundant DISTINCT temporary table. + String sql=candidates("SUMMARY".equals(kind))+" bounds AS (SELECT evidence.*," +"CASE WHEN evidence_at_utc IS NOT NULL AND #{p.completeFrom} IS NOT NULL AND #{p.completeUntil} IS NOT NULL THEN " +"GREATEST(#{p.from},#{p.completeFrom},TIMESTAMPADD(DAY,CASE WHEN CAST("+localEvidence+" AS TIME)='00:00:00' THEN 0 ELSE 1 END,DATE("+localEvidence+"))) END full_start," +"LEAST(#{p.until},#{p.completeUntil},#{p.anchor}) full_end," @@ -62,7 +61,7 @@ public final class AnalyticsReadSql { +"FROM ll_selfop_sku_daily_sales WHERE sales_run_id=#{p.salesRun} AND"+KEY_FILTER +" AND business_date>=TIMESTAMPADD(DAY,-30,#{p.anchor}) AND business_date=DATE_SUB")); assertFalse(page.contains("ll_selfop_inventory_snapshot")); assertFalse(page.contains("metric_sales"));assertFalse(page.contains("FROM bounds WHERE 1=0")); - assertTrue(page.contains("bounds AS (SELECT DISTINCT evidence.*,")); + assertTrue(page.contains("bounds AS (SELECT evidence.*,")); + assertTrue(page.contains("counted AS (SELECT /*+ NO_MERGE(b) */ b.*,")); assertTrue(page.endsWith("ORDER BY observed_quantity IS NULL,observed_quantity DESC,sku_code ASC,customer_code ASC LIMIT ? OFFSET ?")); assertTrue(page.indexOf("GROUP BY d.customer_code,d.sku_code")