在我的java应用程序中,我将烛台数据存储在sqlite数据库中(我是sqlite语言中的新功能)。数据库包含每个库存的一个表,其中包含列:日期,开放,高,低,关闭。 为了显示每月蜡烛,我需要一个ResultSet存储每个月的第一个和最后一个值,最大值为高,最小值为低。 我能够通过以下方式检索最后两个数据:
SELECT STRFTIME("%Y-%m", date/1000,'unixepoch', 'localtime') AS Date, max(high) AS High, min(low) AS Low
对于第一个需要的数据,我试图找到记录:
where strftime('%m', date/1000, 'unixepoch', 'localtime')<>strftime('%m', date/1000, 'unixepoch', 'localtime','+1 day')
但如果月份中的最后一条记录例如在2015-10-29停止,那么查询本月会明显跳过,因为+1天是2015-10-30
如何正确使用? 感谢所有
编辑: 关于&#39;关闭&#39;的最后一个月值的整个查询:
SELECT strftime('%Y-%m-%d', data/1000, 'unixepoch', 'localtime') AS data, close from SP_500 where strftime('%m', data/1000, 'unixepoch', 'localtime')<>strftime('%m', data/1000, 'unixepoch', 'localtime','+1 day') order by data desc
GROUP BY STRFTIME("%Y-%m", data/1000,'unixepoch', 'localtime')
编辑2:任何感兴趣的工作代码(感谢CL。)是:
SELECT strftime('%Y-%m-%d', max(data) / 1000, 'unixepoch', 'localtime') as data,
(SELECT open
FROM SP_500 AS T
WHERE T.data = MIN(SP_500.data)
GROUP BY strftime('%Y-%m', T.data / 1000, 'unixepoch', 'localtime')
) AS month_open,
max(high) AS month_high,
min(low) AS month_low,
(SELECT close
FROM SP_500 AS T
WHERE T.data = MAX(SP_500.data)
GROUP BY strftime('%Y-%m', T.data / 1000, 'unixepoch', 'localtime')
) AS month_close
FROM SP_500
GROUP BY strftime('%Y-%m', data / 1000, 'unixepoch', 'localtime')
ORDER BY data DESC
答案 0 :(得分:2)
每个月的第一个和最后一个记录是具有最小/最大date
值的记录:
SELECT strftime(..., MIN(date) / 1000, ...) AS first_date,
strftime(..., MAX(date) / 1000, ...) AS last_date,
...
FROM SP_500
GROUP BY strftime('%Y-%m', date / 1000, ...);
要获取相应的值,您需要子查询:
SELECT (SELECT open
FROM SP_500 AS T
WHERE T.date = MIN(SP_500.date)
) AS month_open,
(SELECT close
FROM SP_500 AS T
WHERE T.date = MAX(SP_500.date)
) AS month_close,
...
FROM SP_500
GROUP BY strftime('%Y-%m', date / 1000, ...);