如何根据一列限制行数?
How can I limit rows based on one column?
我有一个 table,其中包含 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 值,它将 return 所有具有唯一时间戳的行。
example 1
我希望它忽略多个时间戳,每个 OSI_key 只有 return 一行。也许最新的时间戳看起来像这样:
example 2
这可能吗?
做 t1.time 的最大值:
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
但是由于您从同一个 table 中获取值和数据,因此更加简单:
SELECT osi_key, MAX(time) as maxTime, MAX(value) as maxValue from data_values_6_2020
group by osi_key
您可以使用 window 函数,如果您的数据库支持它们:
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
我有一个 table,其中包含 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 值,它将 return 所有具有唯一时间戳的行。
example 1
我希望它忽略多个时间戳,每个 OSI_key 只有 return 一行。也许最新的时间戳看起来像这样:
example 2
这可能吗?
做 t1.time 的最大值:
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
但是由于您从同一个 table 中获取值和数据,因此更加简单:
SELECT osi_key, MAX(time) as maxTime, MAX(value) as maxValue from data_values_6_2020
group by osi_key
您可以使用 window 函数,如果您的数据库支持它们:
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