StockPoolHistoryMapper.xml 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  3. <mapper namespace="com.yingpai.gupiao.mapper.StockPoolHistoryMapper">
  4. <!-- 查询历史数据(带隔日信息),每只股票只取隔日涨幅最大的一条 -->
  5. <select id="selectHistoryWithNextDay" resultType="com.yingpai.gupiao.domain.vo.StockHistoryVO">
  6. SELECT
  7. t.id,
  8. t.recordDate,
  9. t.stockCode,
  10. t.stockName,
  11. t.closePrice,
  12. t.nextDayHighPrice,
  13. t.nextDayHighTrend,
  14. CASE
  15. WHEN t.nextDayHighTrend IS NOT NULL AND t.nextDayHighTrend >= 2 THEN 'success'
  16. WHEN t.nextDayHighTrend IS NOT NULL AND t.nextDayHighTrend &lt;= -3 THEN 'fail'
  17. ELSE NULL
  18. END AS status
  19. FROM (
  20. SELECT
  21. h.id,
  22. h.record_date AS recordDate,
  23. h.stock_code AS stockCode,
  24. h.stock_name AS stockName,
  25. h.close_price AS closePrice,
  26. next_day.day_highest_price AS nextDayHighPrice,
  27. next_day.high_trend AS nextDayHighTrend,
  28. ROW_NUMBER() OVER (PARTITION BY h.stock_code ORDER BY COALESCE(next_day.high_trend, -9999) DESC) AS rn
  29. FROM stock_pool_history h
  30. INNER JOIN stock_pool sp ON h.stock_code = sp.stock_code
  31. AND sp.pool_type = #{poolType}
  32. AND sp.status = 1
  33. LEFT JOIN (
  34. SELECT
  35. stock_code,
  36. record_date,
  37. day_highest_price,
  38. high_trend
  39. FROM stock_pool_history
  40. ) next_day ON h.stock_code = next_day.stock_code
  41. AND next_day.record_date = (
  42. SELECT MIN(record_date)
  43. FROM stock_pool_history
  44. WHERE stock_code = h.stock_code
  45. AND record_date > h.record_date
  46. )
  47. WHERE h.record_date >= #{startDate}
  48. AND h.record_date &lt;= #{endDate}
  49. ) t
  50. WHERE t.rn = 1
  51. ORDER BY CASE WHEN t.nextDayHighTrend IS NULL THEN 1 ELSE 0 END, t.nextDayHighTrend DESC
  52. LIMIT #{limit} OFFSET #{offset}
  53. </select>
  54. <!-- 统计记录总数(每只股票只算一条) -->
  55. <select id="countHistory" resultType="int">
  56. SELECT COUNT(DISTINCT h.stock_code)
  57. FROM stock_pool_history h
  58. INNER JOIN stock_pool sp ON h.stock_code = sp.stock_code
  59. AND sp.pool_type = #{poolType}
  60. AND sp.status = 1
  61. WHERE h.record_date >= #{startDate}
  62. AND h.record_date &lt;= #{endDate}
  63. </select>
  64. <!-- 查询统计数据(成功率、平均收益、总交易次数) -->
  65. <select id="selectHistoryStats" resultType="map">
  66. SELECT
  67. COUNT(*) AS totalCount,
  68. SUM(CASE WHEN nextDayHighTrend >= 2 THEN 1 ELSE 0 END) AS successCount,
  69. SUM(CASE WHEN nextDayHighTrend &lt;= -3 THEN 1 ELSE 0 END) AS failCount,
  70. AVG(nextDayHighTrend) AS avgTrend
  71. FROM (
  72. SELECT
  73. h.stock_code,
  74. next_day.high_trend AS nextDayHighTrend,
  75. ROW_NUMBER() OVER (PARTITION BY h.stock_code ORDER BY COALESCE(next_day.high_trend, -9999) DESC) AS rn
  76. FROM stock_pool_history h
  77. INNER JOIN stock_pool sp ON h.stock_code = sp.stock_code
  78. AND sp.pool_type = #{poolType}
  79. AND sp.status = 1
  80. LEFT JOIN (
  81. SELECT
  82. stock_code,
  83. record_date,
  84. high_trend
  85. FROM stock_pool_history
  86. ) next_day ON h.stock_code = next_day.stock_code
  87. AND next_day.record_date = (
  88. SELECT MIN(record_date)
  89. FROM stock_pool_history
  90. WHERE stock_code = h.stock_code
  91. AND record_date > h.record_date
  92. )
  93. WHERE h.record_date >= #{startDate}
  94. AND h.record_date &lt;= #{endDate}
  95. ) t
  96. WHERE t.rn = 1
  97. </select>
  98. <!-- 根据股票代码或名称模糊查询最新的历史记录 -->
  99. <select id="selectLatestByKeyword" resultType="com.yingpai.gupiao.domain.vo.StockHistoryVO">
  100. SELECT
  101. h.id,
  102. h.record_date AS recordDate,
  103. h.stock_code AS stockCode,
  104. h.stock_name AS stockName,
  105. h.change_percent AS changePercent,
  106. h.close_price AS closePrice,
  107. h.total_amount AS totalAmount,
  108. h.strength_score AS strengthScore,
  109. h.circulation_market_value AS circulationMarketValue,
  110. h.main_rise_period AS mainRisePeriod,
  111. h.recent_rise_hand AS recentRiseHand,
  112. h.recent_limit_up AS recentLimitUp,
  113. h.day_highest_price AS dayHighestPrice,
  114. h.day_lowest_price AS dayLowestPrice,
  115. h.day_avg_price AS dayAvgPrice,
  116. h.day_close_price AS dayClosePrice,
  117. h.high_trend AS highTrend
  118. FROM stock_pool_history h
  119. WHERE (h.stock_code LIKE CONCAT('%', #{keyword}, '%')
  120. OR h.stock_name LIKE CONCAT('%', #{keyword}, '%'))
  121. ORDER BY h.record_date DESC
  122. LIMIT 1
  123. </select>
  124. <!-- 根据股票代码或名称和日期查询历史记录 -->
  125. <select id="selectByKeywordAndDate" resultType="com.yingpai.gupiao.domain.vo.StockHistoryVO">
  126. SELECT
  127. h.id,
  128. h.record_date AS recordDate,
  129. h.stock_code AS stockCode,
  130. h.stock_name AS stockName,
  131. h.change_percent AS changePercent,
  132. h.close_price AS closePrice,
  133. h.total_amount AS totalAmount,
  134. h.strength_score AS strengthScore,
  135. h.circulation_market_value AS circulationMarketValue,
  136. h.main_rise_period AS mainRisePeriod,
  137. h.recent_rise_hand AS recentRiseHand,
  138. h.recent_limit_up AS recentLimitUp,
  139. h.day_highest_price AS dayHighestPrice,
  140. h.day_lowest_price AS dayLowestPrice,
  141. h.day_avg_price AS dayAvgPrice,
  142. h.day_close_price AS dayClosePrice,
  143. h.high_trend AS highTrend
  144. FROM stock_pool_history h
  145. WHERE (h.stock_code LIKE CONCAT('%', #{keyword}, '%')
  146. OR h.stock_name LIKE CONCAT('%', #{keyword}, '%'))
  147. AND h.record_date = #{recordDate}
  148. LIMIT 1
  149. </select>
  150. </mapper>