如何在Sqlite中获取每月的第一个和最后一个记录

时间:2016-01-31 07:40:02

标签: java sqlite

在我的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

1 个答案:

答案 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, ...);