相同id算做一组,取num一组中time最早日期的val值,到单独的列

img


相同id算做一组,取num一组中time最早日期的val值,到单独的列。怎样通过oracle的sql实现?

img


不是要这样的效果

SELECT id, num, MIN(time) AS earliest_time, 
       FIRST_VALUE(val) OVER (PARTITION BY id, num ORDER BY time) AS earliest_val
FROM your_table
GROUP BY id, num;

运行结果:

img

实现代码:

select T.id,T.num,T.time,T.val
from t_your_table T
where EXISTS (
    SELECT 1
    from (
        select
            id,num,min(time) as time
        from t_your_table 
        group by id,num
    ) T2
    where T2.id = T.id and T2.num = T.num and T2.time = T.time
);

引用chatGPT作答,可以使用Oracle的分析函数和子查询来实现。假设表名为"table_name",id为组ID,num为组内序号,time为时间,val为值,则可以使用以下SQL语句:

SELECT id, val, time
FROM (
  SELECT id, val, time, 
         ROW_NUMBER() OVER (PARTITION BY id, num ORDER BY time) AS rn
  FROM table_name
) t
WHERE t.rn = 1;

该查询首先使用子查询将每个组中num最小的行筛选出来,并通过分析函数ROW_NUMBER()进行排序。然后,外部查询将结果进一步筛选,只保留每个组中的第一行(即时间最早的行)。

注意,如果需要将结果插入到另一个表中,可以使用INSERT INTO ... SELECT ... 语句。例如:

INSERT INTO new_table (id, val, time)
SELECT id, val, time
FROM (
  SELECT id, val, time, 
         ROW_NUMBER() OVER (PARTITION BY id, num ORDER BY time) AS rn
  FROM table_name
) t
WHERE t.rn = 1;

可以尝试使用以下 Oracle SQL 语句来实现需求:

SELECT t1.ID, t1.NUM, t1.TIME, t1.VAL
FROM table_name t1
WHERE t1.TIME = (
    SELECT MIN(t2.TIME)
    FROM table_name t2
    WHERE t2.ID = t1.ID AND t2.NUM = t1.NUM
)

其中,table_name 是您数据存储的表名,根据您提供的数据,该表应该有四个列,分别是 ID、NUM、TIME 和 VAL。此语句将返回每组相同 ID 的 NUM 中时间最早的记录,包括所有列的值。如果您只需要取出每组相同 ID 的 NUM 中时间最早的 VAL 值,则可以用以下 SQL 语句:

SELECT t1.ID, t1.NUM, t1.TIME, t1.VAL
FROM table_name t1
WHERE t1.TIME = (
    SELECT MIN(t2.TIME)
    FROM table_name t2
    WHERE t2.ID = t1.ID AND t2.NUM = t1.NUM
)
AND t1.VAL = (
    SELECT MIN(t3.VAL)
    FROM table_name t3
    WHERE t3.ID = t1.ID AND t3.NUM = t1.NUM AND t3.TIME = t1.TIME
)

该语句会先筛选出每组相同 ID 的 NUM 中时间最早的记录,然后从中取出 VAL 值最小的记录,最终返回这些记录的所有列的值。

以下答案由GPT-3.5大模型与博主波罗歌共同编写:
假设有一个表名为table1,包含以下字段:id, num, time, val。

  1. 取num一组中time最早日期的val值,到单独的列

这个需求可以通过子查询和窗口函数实现。首先使用子查询获取每个num组中time最早日期的val值,然后使用窗口函数将其转换成单独的列。

代码如下:

SELECT id, num, time, val, 
(SELECT val FROM table1 t2 WHERE t1.num = t2.num ORDER BY time LIMIT 1) AS earliest_val
FROM table1 t1;
  1. 相同id算做一组,取num一组中time最早日期的val值,到单独的列

这个需求需要在上面的查询基础上,再进行分组操作,按照id和num分组,并且取出每个组中time最早日期的val值。

代码如下:

SELECT id, num, 
(SELECT val FROM table1 t2 WHERE t1.num = t2.num AND t1.id = t2.id ORDER BY time LIMIT 1) AS earliest_val
FROM table1 t1
GROUP BY id, num;

如果我的回答解决了您的问题,请采纳!