@@ -217,21 +217,43 @@ interface TradeRepository : ReactiveCrudRepository<TradeModel, Long> {
217217 @Query(" select symbol, matched_price from trades where create_date in (select max(create_date) from trades group by symbol)" )
218218 fun findAllGroupBySymbol (): Flux <LastPrice >
219219
220- @Query(
221- """
222- WITH intervals AS (SELECT * FROM interval_generator((TO_TIMESTAMP(:startTime)) ::TIMESTAMP WITHOUT TIME ZONE, (:endTime), :interval ::INTERVAL)),
223- first_trade AS (
224- SELECT DISTINCT ON (f.start_time) f.start_time, f.end_time, t.matched_price AS open_price FROM intervals f
225- LEFT JOIN trades t ON t.create_date >= f.start_time AND t.create_date < f.end_time AND t.symbol = :symbol
226- ORDER BY f.start_time, t.create_date
227- ), last_trade AS (
228- SELECT DISTINCT ON (f.start_time) f.start_time, f.end_time, t.matched_price AS close_price FROM intervals f
229- LEFT JOIN trades t ON t.create_date >= f.start_time AND t.create_date < f.end_time AND t.symbol = :symbol
230- ORDER BY f.start_time, t.create_date DESC
220+ @Query("""
221+ WITH intervals AS (
222+ SELECT *
223+ FROM interval_generator(
224+ (:startTime)::TIMESTAMP WITHOUT TIME ZONE,
225+ (:endTime)::TIMESTAMP WITHOUT TIME ZONE,
226+ :interval::INTERVAL
231227 )
228+ ),
229+ first_trade AS (
230+ SELECT DISTINCT ON (f.start_time)
231+ f.start_time,
232+ f.end_time,
233+ t.matched_price AS open_price
234+ FROM intervals f
235+ LEFT JOIN trades t
236+ ON t.create_date >= f.start_time
237+ AND t.create_date < f.end_time
238+ AND t.symbol = :symbol
239+ ORDER BY f.start_time, t.create_date
240+ ),
241+ last_trade AS (
242+ SELECT DISTINCT ON (f.start_time)
243+ f.start_time,
244+ f.end_time,
245+ t.matched_price AS close_price
246+ FROM intervals f
247+ LEFT JOIN trades t
248+ ON t.create_date >= f.start_time
249+ AND t.create_date < f.end_time
250+ AND t.symbol = :symbol
251+ ORDER BY f.start_time, t.create_date DESC
252+ ),
253+ ohlcv AS (
232254 SELECT
233255 i.start_time AS open_time,
234- i.end_time AS close_time,
256+ i.end_time AS close_time,
235257 ft.open_price AS open,
236258 MAX(t.matched_price) AS high,
237259 MIN(t.matched_price) AS low,
@@ -240,15 +262,24 @@ interface TradeRepository : ReactiveCrudRepository<TradeModel, Long> {
240262 COUNT(t.id) AS trades
241263 FROM intervals i
242264 LEFT JOIN trades t
243- ON t.create_date >= i.start_time AND t.create_date < i.end_time AND t.symbol = :symbol
265+ ON t.create_date >= i.start_time
266+ AND t.create_date < i.end_time
267+ AND t.symbol = :symbol
244268 LEFT JOIN first_trade ft
245- ON i.start_time = ft.start_time
269+ ON i.start_time = ft.start_time
246270 LEFT JOIN last_trade lt
247- ON i.start_time = lt.start_time
271+ ON i.start_time = lt.start_time
248272 GROUP BY i.start_time, i.end_time, ft.open_price, lt.close_price
249- ORDER BY i.start_time;
250- """
251273 )
274+ SELECT *
275+ FROM (
276+ SELECT *
277+ FROM ohlcv
278+ ORDER BY open_time DESC
279+ limit :limit
280+ ) sub
281+ ORDER BY open_time ASC
282+ """ )
252283 suspend fun candleData (
253284 @Param(" symbol" )
254285 symbol : String ,
0 commit comments