[求助]分组查询同时返回组内第1行的某个字段

yangmijun 2011-11-10 07:38:14
问题如下:

假定有如下视图(ORACLE 10g):

产品ID 长 宽 高
YA0023 20 10 15
123456 20 10 15
W65027 20 10 15
119925 50 40 30
235685 50 40 30
123D53 10 10 65
YL2565 10 10 65
022256 10 10 65

首先需要按照“长、宽、高”三个字段(描述产品规格)分组,将“长、宽、高”完全相同的行合并,
然后取得每组中第一行的“产品ID”拼在分组结果上,
最后要求的结果如下:

产品ID 长 宽 高
YA0023 20 10 15
119925 50 40 30
123D53 10 10 65

注:
1. 原视图中没有类似“序列号”的列
2. 原视图中的行排列顺序是按照时间倒序排列的,即排在上面的产品生产时间距离当前时间更近
2. “产品ID”列为字母数字组合,不是按照字母数字自然排序产生的
4. 实际的数据库中数据总量大概有10万行左右,实际需要分组的产品规格字段大概有20个左右,分组后的结果估计有1万行左右,这就要求查询性能不能太慢

整个问题概括起来大概是:
从生产历史记录中统计生产产品“规格”数量,同时返回每个规格最后生产的产品ID。

求助ORACLE专家,这个问题该怎么解决?

...全文
103 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
007-x 2011-11-11
  • 打赏
  • 举报
回复
我理解lz主说的第一行是默认排序的,那就随便排序了
[Quote=引用 2 楼 xiaobn_cn 的回复:]
1楼的over中不应当加order by,加了order by product_id desc得到的就不是第1条记录了,而是product_id最大的一条记录。
[/Quote]
BenChiM888 2011-11-11
  • 打赏
  • 举报
回复

--1、我需要那个时间字段 假设为dtime
--2、查询语句如下
SELECT 产品ID,长,宽,高
FROM (SELECT 产品ID,长,宽,高,
ROW_NUMBER() OVER(PARTITION BY 长,宽,高 ORDER BY dtime DESC) ROW_
FROM TAB1)
WHERE ROW_ = 1;

xiaobn_cn 2011-11-11
  • 打赏
  • 举报
回复
1楼的over中不应当加order by,加了order by product_id desc得到的就不是第1条记录了,而是product_id最大的一条记录。
yangmijun 2011-11-11
  • 打赏
  • 举报
回复
实际数据库里还有一个专门的时间戳字段,可以用来做 order by,
我试了一下,总数据行数近 6 万,查询结果行数近 8 千,用时不到 2秒,确实能满足要求,谢谢各位。
007-x 2011-11-10
  • 打赏
  • 举报
回复
用row_number函数又快又方便
SELECT product_id,
LEN,
Width,
Height
FROM (SELECT product_id,
LEN,
Width,
Height,
ROW_NUMBER ()
OVER (PARTITION BY LEN, Width, Height
ORDER BY product_id desc )
rn
FROM tab1)
WHERE rn = 1

17,086

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧