我花了很长时间研究这个。我尝试了使用子查询、max
函数、group by having
和union left join
的各种方法。
也可以在这里阅读许多解决类似但不相同问题的答案。或者,它们使用SQLite中不可用的特性(如过程逻辑)进行解析。
下表由此查询生成:
select strftime(' %Y-%m-%d', datetime(date, 'unixepoch')) as date, quantity from summary order by date
| 日期|数量|
| --|--|
| 2015-07-20 2015-07-20| 346 |
| 2015-07-30 2015-07-30| 688 |
| 2015-07-31| 1222 |
| 2015-08-02 2015-08-02| 1291 |
| 2015-08-12 2015-08-12 2015-08-12| 1416 |
| 2015-08-28 2015-08-28| 1618 |
| 2015-09-01 2015-09-01| 1618 |
| 2015-09-11 2015-09-11 2015-09-11| 1804 |
| 2015-09-29 2015-09-29| 1846 |
所需的结果集是按月的最后日期的数量。日期可能会有所不同。鉴于上表,它将是三行,对应于七月,八月和九月:
| 日期|数量|
| --|--|
| 2015-07-31| 1222 |
| 2015-08-28 2015-08-28| 1618 |
| 2015-09-29 2015-09-29| 1846 |
是否有一个select
查询可以生成上面的三行?
下面是在本地示例上尝试此操作的测试数据。首先,创建table语句:
CREATE TABLE summary ( date integer , quantity integer )
请注意,我别无选择,只能使用Unix Epoch的日期。插入物:
insert into summary values (1437408078, 346);
insert into summary values (1438262109, 688);
insert into summary values (1438342858, 1222);
insert into summary values (1438554528, 1291);
insert into summary values (1439405315, 1416);
insert into summary values (1440766612, 1618);
insert into summary values (1441126629, 1618);
insert into summary values (1441968543, 1804);
insert into summary values (1443543335, 1846);
根据上表第一项,进行测试查询以确认结果:
select strftime(' %Y-%m-%d', datetime(date, 'unixepoch')) as date, quantity from summary order by date
2条答案
按热度按时间8wtpewkr1#
这里有一种方法,使用
group by
将数据按月分组,然后将最大日期及其相关数量作为空列:测试结果:
一种不使用裸列的更通用的方法:
Demo here
pgx2nnw82#
使用SUSBSTR()仅提取日期的年份和月份:
请注意,这个查询使用了“空列”,这使得它与除SQLite之外的大多数其他数据库引擎不兼容。例如,在Postgres中,我必须使用
而更详细的JOIN版本似乎快了两倍: