MySQL生产环境_使用SQL中的ROW_NUMBER()函数查找每个ID的最新记录

生产需求

应生产环境要求,需要获取到每个id的最新位置及其他GL属性

ROW_NUMBER函数

        ROW_NUMBER()函数是一种窗口函数,可以根据指定的列对结果集中的行进行编号。通过结合PARTITION BY子句和ORDER BY子句,ROW_NUMBER()函数能够对数据进行分组排序,并为每个分组中的行分配一个唯一的数字序号。


SQL代码:

select *

from

(select *,row_number() over (partition by `id` order by `time` desc ) as rank

from `table1`) 

where rank = 1

-- by_https://blog.csdn.net/qq_52128187?spm=1010.2135.3001.5343

代码逻辑:

        首先使用ROW_NUMBER()函数对表中的数据按照ID进行分区(partition by id),然后按时间降序排序(order by time desc)。这样就创建了一个排名(rank),每个ID组内的第一行将获得排名1,第二行将获得排名2,依此类推。接着,外层查询选择了排名为1的行,即每个ID的最新记录

PySpark代码

# 导入所需的库
from pyspark.sql import SparkSession
from pyspark.sql.window import Window
import pyspark.sql.functions as F

spark = SparkSession.builder.appName("latest_records").getOrCreate()

data = [
    (1, "Record 1", "2022-01-01 12:00:00"),
    (2, "Record 2", "2022-01-02 10:00:00"),
    (1, "Record 3", "2022-01-03 08:00:00"),
    (3, "Record 4", "2022-01-04 14:00:00"),
    (2, "Record 5", "2022-01-05 16:00:00")
]

columns = ["id", "description", "time"]

df = spark.createDataFrame(data, columns)
df = df.withColumn("time", F.to_timestamp("time"))
# 定义窗口规范
windowSpec = Window.partitionBy("id").orderBy(F.col("time").desc())

# 使用ROW_NUMBER()函数查找每个ID的最新记录
ranked_df = df.withColumn("rank", F.row_number().over(windowSpec)).filter(F.col("rank") == 1).drop("rank")

ranked_df.show()

猜你喜欢

转载自blog.csdn.net/qq_52128187/article/details/134893065