Firebird 3.0.8中查询距第三次事件的天数(LibreOffice Base)
问题描述
在LibreOffice Base中使用Firebird 3.0.8数据库,现有一张记录事件发生次数的Events表,示例数据如下:
| Date | EventCount |
|---|---|
| 22-04-01 | 15 |
| 22-09-30 | 10 |
| 22-10-01 | 1 |
| 22-10-04 | 1 |
需要创建查询计算从今日到第三次事件发生日的天数(示例中第三次事件日期为22-09-30)。现有查询代码如下,但其中的固定日期DATE '30-09-2022'需要替换为动态获取对应第三次事件的Date字段值的语句:
SELECT "Date" WHERE DATEDIFF(DAY, CURRENT_DATE, DATE '30-09-2022') AS "Third Last Event" FROM "Events"
解决方案
要动态获取第三次事件的日期,需先对Events表按日期倒序排序(最新事件在前),再取排序后的第3条记录的Date值,以下是两种可行实现方式:
方法1:窗口函数子查询
SELECT DATEDIFF(DAY, CURRENT_DATE, third_event."Date") AS "Days to Third Last Event" FROM ( SELECT "Date", ROW_NUMBER() OVER(ORDER BY "Date" DESC) AS event_rank FROM "Events" ) AS third_event WHERE third_event.event_rank = 3
方法2:OFFSET + FETCH直接获取目标日期
SELECT DATEDIFF(DAY, CURRENT_DATE, ( SELECT "Date" FROM "Events" ORDER BY "Date" DESC OFFSET 2 ROWS FETCH NEXT 1 ROW ONLY )) AS "Days to Third Last Event"
补充说明
- 两种逻辑均以“最新事件为第1次”的规则排序,跳过前2条后取第1条即为目标的第三次事件日期。
- Firebird的
DATEDIFF参数顺序为DATEDIFF(单位, 起始日期, 结束日期),若需要得到今日与过去事件的正天数差,可调整参数顺序为DATEDIFF(DAY, "Date", CURRENT_DATE)。
内容的提问来源于stack exchange,提问作者hiigaran
相关产品推荐
相关产品推荐

