库存的明细表,我用sql汇总了库存量,然后按生产日期排序。我可以怎么取每只物料的第一行数据。
物料名称 | 日期 | 库存量 |
---|---|---|
A | 2024-10-07 | 50 |
A | 2024-10-09 | 49 |
A | 2024-10-10 | 48 |
B | 2024-10-02 | 49 |
B | 2024-10-06 | 49 |
请问大佬们,我怎么取7号的A, 2号的B
库存的明细表,我用sql汇总了库存量,然后按生产日期排序。我可以怎么取每只物料的第一行数据。
物料名称 | 日期 | 库存量 |
---|---|---|
A | 2024-10-07 | 50 |
A | 2024-10-09 | 49 |
A | 2024-10-10 | 48 |
B | 2024-10-02 | 49 |
B | 2024-10-06 | 49 |
请问大佬们,我怎么取7号的A, 2号的B
以下内容来自 AI
在SQL中,你可以使用GROUP BY
和ORDER BY
语句来实现你的需求。但是,直接选择每个分组的第一条数据需要一些额外的逻辑,因为SQL标准本身不提供直接选择每个分组第一条记录的方法。
以下是一些常见的数据库系统中实现这个需求的方法:
如果你的数据库支持窗口函数,你可以使用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的记录。
如果你的数据库不支持窗口函数,你可以使用子查询和聚合函数来实现。
SELECT *
FROM 你的表名 AS a
WHERE (物料名称, 生产日期) IN (
SELECT 物料名称, MIN(生产日期)
FROM 你的表名
GROUP BY 物料名称
);
这个查询首先找出每个物料名称分组的最小生产日期,然后从原表中选择这些记录。
另一种方法是使用表的自连接来找到每个分组的第一条记录。
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 "物料名称"
3 回答1.1k 阅读✓ 已解决
1 回答1.3k 阅读✓ 已解决
1 回答1k 阅读✓ 已解决
2 回答973 阅读✓ 已解决
1 回答920 阅读✓ 已解决
2 回答857 阅读
852 阅读
分组、编号、筛选
select * from (