如何根据一列限制行数?

Posted

技术标签:

【中文标题】如何根据一列限制行数?【英文标题】:How can I limit rows based on one column? 【发布时间】:2020-10-21 06:53:16 【问题描述】:

我有一个表,其中包含 osi_key(标识号)、值和时间的列。 我想知道每个 osi_key 何时达到其最大值。 我编写了一个 SQL 查询来执行此操作:

SELECT t1.osi_key, t1.time, t1.value
FROM
(
SELECT osi_key, MAX(value) AS max_value
FROM data_values_6_2020
WHERE value > 0
GROUP BY osi_key
) AS t2
INNER JOIN data_values_6_2020 AS t1
ON t1.osi_key = t2.osi_key
AND t1.value = t2.max_value

example

但是,如果它看到相同 osi_key 的重复 MAX 值,它将返回具有唯一时间戳的所有行。

example 1

我希望它忽略多个时间戳,并且只为每个 OSI_key 返回一行。也许最新的时间戳看起来像这样:

example 2

这可能吗?

【问题讨论】:

请在您的问题中添加标签,让其他人知道您使用的是哪个 DBMS 【参考方案1】:

如果您的数据库支持,您可以使用窗口函数:

select osi_key, time, value
from (
    select 
        d.*, 
        row_number() over(partition by osi_key order by value desc, time desc) rn
    from data_values_6_2020 d
) t
where rn = 1

【讨论】:

【参考方案2】:

做t1.time的MAX:

SELECT t1.osi_key, MAX(t1.time), t1.value FROM ( SELECT osi_key, MAX(value)
AS max_value FROM data_values_6_2020 WHERE value > 0 GROUP BY osi_key ) AS t2
INNER JOIN data_values_6_2020 AS t1 ON t1.osi_key = t2.osi_key AND t1.value =
t2.max_value
GROUP BY t1.osi_key, t1.osi_key

但是由于您从同一个表中获取值和数据更简单:

SELECT osi_key, MAX(time) as maxTime, MAX(value) as maxValue from data_values_6_2020
group by osi_key

【讨论】:

我读了你的问题,但我的回答并不完全正确。它获取 MAX 值和 osi_key 更改的最后日期......最后日期并不总是对应于最大值...... 你说得对,它并没有让我得到我想要的结果,因为返回的日期与最大值不对应。但是感谢您的尝试。

以上是关于如何根据一列限制行数?的主要内容,如果未能解决你的问题,请参考以下文章

如何根据原始文件的第一列值组织新文件?

根据单元格原始列的行数将特定单元格的内容复制到空列

根据日期和在 Snowflake 中的另一个表中为该日期列出的最大行数限制插入到表中的行

根据第一列中数据的比较将数据从工作表复制到另一个工作表

如何防止`UILabel`的文本顶部根据行数或截断而改变?

如何删除EXCEL表中的大量数据行,要删除的行数大概8万