sql语句怎么取每种物料的第一行数据?

库存的明细表,我用sql汇总了库存量,然后按生产日期排序。我可以怎么取每只物料的第一行数据。

物料名称日期库存量
A2024-10-0750
A2024-10-0949
A2024-10-1048
B2024-10-0249
B2024-10-0649

请问大佬们,我怎么取7号的A, 2号的B

阅读 1k
3 个回答
新手上路,请多包涵

分组、编号、筛选

select * from (

   select  * , row_number()over(partition by 物料  order by 日期  ) as 编号                from 表 ) as bb where bb.编号='1'

以下内容来自 AI


在SQL中,你可以使用GROUP BYORDER BY语句来实现你的需求。但是,直接选择每个分组的第一条数据需要一些额外的逻辑,因为SQL标准本身不提供直接选择每个分组第一条记录的方法。

以下是一些常见的数据库系统中实现这个需求的方法:

1. 使用窗口函数(如ROW_NUMBER())

如果你的数据库支持窗口函数,你可以使用ROW_NUMBER()来为每个分组内的记录分配一个序号,然后选择序号为1的记录。

SELECT *
FROM (
    SELECT *,
           ROW_NUMBER() OVER (PARTITION BY 物料名称 ORDER BY 生产日期 ASC) AS rn
    FROM 你的表名
) AS subquery
WHERE rn = 1;

这里,ROW_NUMBER()函数为每个物料名称的分组内的记录分配一个序号,序号是根据生产日期升序排列的。外层的查询则选择序号为1的记录。

2. 使用聚合函数和子查询

如果你的数据库不支持窗口函数,你可以使用子查询和聚合函数来实现。

SELECT *
FROM 你的表名 AS a
WHERE (物料名称, 生产日期) IN (
    SELECT 物料名称, MIN(生产日期)
    FROM 你的表名
    GROUP BY 物料名称
);

这个查询首先找出每个物料名称分组的最小生产日期,然后从原表中选择这些记录。

3. 使用自连接

另一种方法是使用表的自连接来找到每个分组的第一条记录。

SELECT a.*
FROM 你的表名 a
LEFT JOIN 你的表名 b
ON a.物料名称 = b.物料名称 AND a.生产日期 > b.生产日期
WHERE b.物料名称 IS NULL;

这个查询通过自连接找到每个物料名称的更早记录,然后选择那些没有更早记录的记录(即每个分组的第一条记录)。

请根据你的具体数据库系统和表结构调整这些查询。如果你需要更具体的帮助,请提供数据库类型和表结构的详细信息。

新手上路,请多包涵

SELECT "物料名称", any_value("日期") as "日期", any_value("库存量") as "库存量" FROM 表名 group by "物料名称"

推荐问题
宣传栏