我有
name: date:
Mike 02-10-14
Will 03-31-18
Charlie 04-21-18
Mike 05-31-18
Will 04-11-17
Charlie 04-15-18
Mike 08-02-17
Will 09-16-18
Charlie 04-12-17
... ...
我想为每个名称按降序排列最近(2)个日期。
name: date:
Mike 05-31-18
Mike 08-02-17
Will 09-16-18
Will 03-31-18
Charlie 04-21-19
Charlie 04-15-19
我一直在尝试按/ max / desc /唯一/不同方法按/顺序进行各种分组,但是找不到保留所有名称的解决方案。我的尝试是在整个表格中而不是每人中获取最近的2个日期。
当前尝试:
SELECT NAME, DATE FROM SIGHTINGS ORDER BY SIGHTED DESC LIMIT 2;
-返回整个表格的2个最新日期
答案 0 :(得分:2)
这将起作用,因为它将日期重新格式化为YY-MM-DD
:
SELECT
t.NAME, t.DATE
FROM SIGHTINGS AS t
WHERE
t.DATE IN (
SELECT
DATE
FROM SIGHTINGS
WHERE SIGHTINGS.NAME = t.NAME
ORDER BY SUBSTR(DATE, 7, 2) || '-' || SUBSTR(DATE, 1, 5) DESC LIMIT 2
)
ORDER BY t.NAME, SUBSTR(t.DATE, 7, 2) || '-' || SUBSTR(t.DATE, 1, 5) DESC;
答案 1 :(得分:1)
带有 Partition By 子句的 Window Function 在这里最合适:https://www.sqlite.org/windowfunctions.html。向下滚动到“ 2.2。PARTITION BY子句”,然后在同一页面上进一步查看row_number()和rank()。
下面是代码,未经测试,因为我无法访问sqlite数据库。因此语法可能会略有不同。我最熟悉的是SQL Server。
SELECT t.name,
t.date
FROM
(
SELECT name,
date,
row_number() OVER (PARTITION BY name ORDER BY date DESC) AS recency
) as t
WHERE t.recency <= 2
ORDER BY t.name, t.date DESC
顺便说一句,窗口/分区概念在SQL中是通用的。我相信SQL Server和Oracle具有几乎相同的语法。