SQL-为不同的列1选择限制column2值

时间:2018-12-12 22:13:41

标签: sql sqlite unique

我有

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个最新日期

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具有几乎相同的语法。