【问题标题】:How to get the first row with dupes and without using the row_number function?如何在不使用 row_number 函数的情况下获得具有欺骗性的第一行?
【发布时间】:2020-11-10 21:27:02
【问题描述】:

我在 ubuntu 机器上运行一些 SQL,看起来 Windows 函数不可用。我正在尝试让它运行。

SELECT date, deb, req
FROM   (SELECT  date, deb, req,
               Row_number() OVER(Partition BY date, deb, req  ORDER BY date, deb, req ) rn
        FROM   fsm) t
WHERE  rn = 1
And data_date >= '01/01/2020'

这似乎行不通,所以我测试了其他几个想法,但无法运行。我正在使用 MySQL。有什么想法吗?

【问题讨论】:

  • 窗口函数仅在 MySQL 8.0 中可用。您正在运行哪个版本的 MySQL? select version()可以告诉你。

标签: mysql sql datetime where-clause greatest-n-per-group


【解决方案1】:

假设您正在运行 MySQL 的 5.x 版本,其中窗口函数不可用。

您的查询没有什么意义,因为它在窗口函数的partitionorder by 子句中具有相同的列;让我假设您希望每个 datedeb 都有一条记录,其中有最小的 req

如果是这样,您可以通过使用相关子查询过滤数据集来实现相同的逻辑:

select date, deb, req
from fsm f
where date >= '2020-01-01' and f.req = (
    select min(f1.req)
    from fsm f1
    where f1.date = f.date and f1.deb = f.deb
)

这是等效的只要表中没有重复的(date, deb, req);在这种情况下,子查询解决方案返回所有重复项,而窗口函数只返回其中一个。如果这是个问题,您仍然可以在外部查询中使用 select distinct 来解决此特定查询的问题。

请注意,原始查询中的日期文字格式不正确; MySQL 想要日期格式为YYYY-MM-DD

【讨论】:

    猜你喜欢
    • 2019-02-15
    • 1970-01-01
    • 2020-09-05
    • 1970-01-01
    • 2011-03-03
    • 1970-01-01
    • 1970-01-01
    • 2016-08-09
    • 1970-01-01
    相关资源
    最近更新 更多