Zhangbw 1 месяц назад
Родитель
Сommit
addc287a70
1 измененных файлов с 156 добавлено и 0 удалено
  1. 156 0
      src/main/resources/mapper/StockPoolHistoryMapper.xml

+ 156 - 0
src/main/resources/mapper/StockPoolHistoryMapper.xml

@@ -0,0 +1,156 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.yingpai.gupiao.mapper.StockPoolHistoryMapper">
+
+    <!-- 查询历史数据(带隔日信息),每只股票只取隔日涨幅最大的一条 -->
+    <select id="selectHistoryWithNextDay" resultType="com.yingpai.gupiao.domain.vo.StockHistoryVO">
+        SELECT 
+            t.id,
+            t.recordDate,
+            t.stockCode,
+            t.stockName,
+            t.closePrice,
+            t.nextDayHighPrice,
+            t.nextDayHighTrend,
+            CASE 
+                WHEN t.nextDayHighTrend IS NOT NULL AND t.nextDayHighTrend >= 2 THEN 'success'
+                WHEN t.nextDayHighTrend IS NOT NULL AND t.nextDayHighTrend &lt;= -3 THEN 'fail'
+                ELSE NULL
+            END AS status
+        FROM (
+            SELECT 
+                h.id,
+                h.record_date AS recordDate,
+                h.stock_code AS stockCode,
+                h.stock_name AS stockName,
+                h.close_price AS closePrice,
+                next_day.day_highest_price AS nextDayHighPrice,
+                next_day.high_trend AS nextDayHighTrend,
+                ROW_NUMBER() OVER (PARTITION BY h.stock_code ORDER BY COALESCE(next_day.high_trend, -9999) DESC) AS rn
+            FROM stock_pool_history h
+            INNER JOIN stock_pool sp ON h.stock_code = sp.stock_code 
+                AND sp.pool_type = #{poolType} 
+                AND sp.status = 1
+            LEFT JOIN (
+                SELECT 
+                    stock_code,
+                    record_date,
+                    day_highest_price,
+                    high_trend
+                FROM stock_pool_history
+            ) next_day ON h.stock_code = next_day.stock_code 
+                AND next_day.record_date = (
+                    SELECT MIN(record_date) 
+                    FROM stock_pool_history 
+                    WHERE stock_code = h.stock_code 
+                    AND record_date > h.record_date
+                )
+            WHERE h.record_date >= #{startDate}
+              AND h.record_date &lt;= #{endDate}
+        ) t
+        WHERE t.rn = 1
+        ORDER BY CASE WHEN t.nextDayHighTrend IS NULL THEN 1 ELSE 0 END, t.nextDayHighTrend DESC
+        LIMIT #{limit} OFFSET #{offset}
+    </select>
+
+    <!-- 统计记录总数(每只股票只算一条) -->
+    <select id="countHistory" resultType="int">
+        SELECT COUNT(DISTINCT h.stock_code)
+        FROM stock_pool_history h
+        INNER JOIN stock_pool sp ON h.stock_code = sp.stock_code 
+            AND sp.pool_type = #{poolType} 
+            AND sp.status = 1
+        WHERE h.record_date >= #{startDate}
+          AND h.record_date &lt;= #{endDate}
+    </select>
+
+    <!-- 查询统计数据(成功率、平均收益、总交易次数) -->
+    <select id="selectHistoryStats" resultType="map">
+        SELECT 
+            COUNT(*) AS totalCount,
+            SUM(CASE WHEN nextDayHighTrend >= 2 THEN 1 ELSE 0 END) AS successCount,
+            SUM(CASE WHEN nextDayHighTrend &lt;= -3 THEN 1 ELSE 0 END) AS failCount,
+            AVG(nextDayHighTrend) AS avgTrend
+        FROM (
+            SELECT 
+                h.stock_code,
+                next_day.high_trend AS nextDayHighTrend,
+                ROW_NUMBER() OVER (PARTITION BY h.stock_code ORDER BY COALESCE(next_day.high_trend, -9999) DESC) AS rn
+            FROM stock_pool_history h
+            INNER JOIN stock_pool sp ON h.stock_code = sp.stock_code 
+                AND sp.pool_type = #{poolType} 
+                AND sp.status = 1
+            LEFT JOIN (
+                SELECT 
+                    stock_code,
+                    record_date,
+                    high_trend
+                FROM stock_pool_history
+            ) next_day ON h.stock_code = next_day.stock_code 
+                AND next_day.record_date = (
+                    SELECT MIN(record_date) 
+                    FROM stock_pool_history 
+                    WHERE stock_code = h.stock_code 
+                    AND record_date > h.record_date
+                )
+            WHERE h.record_date >= #{startDate}
+              AND h.record_date &lt;= #{endDate}
+        ) t
+        WHERE t.rn = 1
+    </select>
+
+    <!-- 根据股票代码或名称模糊查询最新的历史记录 -->
+    <select id="selectLatestByKeyword" resultType="com.yingpai.gupiao.domain.vo.StockHistoryVO">
+        SELECT
+            h.id,
+            h.record_date AS recordDate,
+            h.stock_code AS stockCode,
+            h.stock_name AS stockName,
+            h.change_percent AS changePercent,
+            h.close_price AS closePrice,
+            h.total_amount AS totalAmount,
+            h.strength_score AS strengthScore,
+            h.circulation_market_value AS circulationMarketValue,
+            h.main_rise_period AS mainRisePeriod,
+            h.recent_rise_hand AS recentRiseHand,
+            h.recent_limit_up AS recentLimitUp,
+            h.day_highest_price AS dayHighestPrice,
+            h.day_lowest_price AS dayLowestPrice,
+            h.day_avg_price AS dayAvgPrice,
+            h.day_close_price AS dayClosePrice,
+            h.high_trend AS highTrend
+        FROM stock_pool_history h
+        WHERE (h.stock_code LIKE CONCAT('%', #{keyword}, '%')
+               OR h.stock_name LIKE CONCAT('%', #{keyword}, '%'))
+        ORDER BY h.record_date DESC
+        LIMIT 1
+    </select>
+
+    <!-- 根据股票代码或名称和日期查询历史记录 -->
+    <select id="selectByKeywordAndDate" resultType="com.yingpai.gupiao.domain.vo.StockHistoryVO">
+        SELECT
+            h.id,
+            h.record_date AS recordDate,
+            h.stock_code AS stockCode,
+            h.stock_name AS stockName,
+            h.change_percent AS changePercent,
+            h.close_price AS closePrice,
+            h.total_amount AS totalAmount,
+            h.strength_score AS strengthScore,
+            h.circulation_market_value AS circulationMarketValue,
+            h.main_rise_period AS mainRisePeriod,
+            h.recent_rise_hand AS recentRiseHand,
+            h.recent_limit_up AS recentLimitUp,
+            h.day_highest_price AS dayHighestPrice,
+            h.day_lowest_price AS dayLowestPrice,
+            h.day_avg_price AS dayAvgPrice,
+            h.day_close_price AS dayClosePrice,
+            h.high_trend AS highTrend
+        FROM stock_pool_history h
+        WHERE (h.stock_code LIKE CONCAT('%', #{keyword}, '%')
+               OR h.stock_name LIKE CONCAT('%', #{keyword}, '%'))
+          AND h.record_date = #{recordDate}
+        LIMIT 1
+    </select>
+
+</mapper>