【问题标题】:SQL - select limit column2 values for distinct column 1SQL - 为不同的列 1 选择限制 column2 值
【发布时间】:2018-12-12 22:13:40
【问题描述】:

我有

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
...        ...

对于每个名字,我想要按 dec 顺序排列的最近 (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

我一直在尝试各种 group by / order by / max / desc / unique / distinct 方法,但找不到保留所有名称的解决方案。我的尝试不断抓取整个表格中的 2 个最近日期,而不是每个人。

当前尝试:

SELECT NAME, DATE FROM SIGHTINGS ORDER BY SIGHTED DESC LIMIT 2;

--返回整个表格的 2 个最近的日期

【问题讨论】:

标签: sql sqlite unique


【解决方案1】:

这会起作用,因为它会将您的日期重新格式化为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;

【讨论】:

  • @user4888 。 . .如果您的问题中的查询有效,我不明白为什么日期格式是一个问题。
  • @GordonLinoff 因为日期在 sqlite 中是 TEXT 并且表格中的格式是 MM-DD-YY 在任何排序之前不需要重新格式化为 YY-MM-DD 吗?
  • @forpas 。 . . OP 说最后的查询返回两个最近的日期。如果日期是字符串(至少对于问题中的示例数据),该查询将不起作用。这就是我向 OP 提出这个问题的原因。
  • @GordonLinoff 这个问题有sqlite3 标签,所以很明显日期是字符串。看到05-31-18这样的值,我断定格式是MM-DD-YY,所以我使用了重新格式化。
【解决方案2】:

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

【讨论】:

  • 这很有帮助。谢谢!
猜你喜欢
  • 2022-01-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-11
  • 2021-01-30
  • 2016-09-28
相关资源
最近更新 更多