一个复杂的SQL查询:如何从每个分组中取得最后一条记录?(高分)

kikilyq 2002-05-17 09:44:02
我有一个table:COMPUTER_PRICE,格式如下:

goods price dates

HP电脑 20000 5.21
HP电脑 20050 5.23
NEC电脑 31200 5.3
NEC电脑 32000 5.5


查询结果要求:要查出每种电脑的最新价格;
上面表的结果为:
goods price dates
HP电脑 20050 5.23
NEC电脑 32000 5.5


帮帮忙,搞定这个问题?
...全文
9000 38 打赏 收藏 转发到动态 举报
写回复
用AI写文章
38 条回复
切换为时间正序
请发表友善的回复…
发表回复
ccat 2002-06-07
  • 打赏
  • 举报
回复 1
刚才的东东有错(因为我用的数据有错),见笑。这里有个子查询版,我再试试联接
SELECT L.GOODS, L.PRICE, L.DATE_TIME
FROM GOODS L
WHERE L.DATE_TIME =
(SELECT
MAX(R.DATE_TIME)
FROM GOODS R
WHERE R.GOODS = L.GOODS
GROUP BY R.GOODS)
ccat 2002-06-07
  • 打赏
  • 举报
回复
刚才的东东有错(因为我用的数据有错),见笑。这里有个子查询版,我再试试联接
SELECT L.GOODS, L.PRICE, L.DATE_TIME
FROM GOODS L
WHERE L.DATE_TIME =
(SELECT
MAX(R.DATE_TIME)
FROM GOODS R
WHERE R.GOODS = L.GOODS
GROUP BY R.GOODS)
ccat 2002-06-07
  • 打赏
  • 举报
回复 1
SELECT GOODS, MAX(PRICE)
FROM GOODS
GROUP BY GOODS, DATE_TIME
HAVING DATE_TIME = MAX(DATE_TIME)
妖招出手,刚在SQL Server中试过,没问题
datapub 2002-06-07
  • 打赏
  • 举报
回复
序号生成器(oracle):
Create Sequence S_Serial
Start With 1
Increment By 1
Nomaxvalue
Order
kknd_net 2002-05-25
  • 打赏
  • 举报
回复
又查了书,发现这个是相关子查询,若水写的还是对的!!!!!!真抱歉
kknd_net 2002-05-25
  • 打赏
  • 举报
回复
select goods,price,dates from computer_price where (goods,dates)=(select goods,max(dates) from computer_price group by goods),
似乎可以避免上面的错误
但是(goods,dates)=(select goods,max(dates) from computer_price group by goods)是否合法?前面是字段,后面可是集合,用in??我也不知道了
kknd_net 2002-05-25
  • 打赏
  • 举报
回复
select goods,price,dates
from computer_price s1
where dates in (select max(dates)
from computer_price s2
where s1.goods = s2.goods);
这样写和若水的是一个道理
HP电脑 20000 5.21
HP电脑 20050 5.23
NEC电脑 31200 5.3
NEC电脑 32000 5.23
NEC电脑 34000 5.25

这样会选出两个日期5.23, 5.25
但是!!!!5.23的NEC电脑价格不是也选上了??但这天的价格不是最新的啊!!!

所以我觉得还是错的啊!!
KingSunSha 2002-05-24
  • 打赏
  • 举报
回复
to 贴主:

那你说怎么办?你总要给出查询的原则吧?

你的问题是:如何从每个分组中取得最后一条记录?
分组我们已经清楚了,那最后究竟是怎么一个最后?
kikilyq 2002-05-24
  • 打赏
  • 举报
回复
如果没有Date怎么办
kikilyq 2002-05-24
  • 打赏
  • 举报
回复
关注!
db2_seeker 2002-05-24
  • 打赏
  • 举报
回复
"select goods,price,dates from computer_price where dates=(select max(dates) from computer_price group by goods)"这样写都是不严谨的,还是弱水兄台写的最严谨。
这样写也行:
select goods,price,dates from computer_price where (goods,dates)=(select goods,max(dates) from computer_price group by goods),
为什么大家一看就知道了!
newnewworm 2002-05-24
  • 打赏
  • 举报
回复
学习一下!
select goods,price,dates from computer_price where dates=(select max(dates) from computer_price group by goods);
lxinjun 2002-05-24
  • 打赏
  • 举报
回复
lihai
水煮蛙 2002-05-24
  • 打赏
  • 举报
回复
学习……:)
datapub 2002-05-23
  • 打赏
  • 举报
回复
如何在ORacle和SqlServer7.0中编写触发器,已达到一个自动增加的字段,当表中新增一条记录时,该字段值自动加1,当删除一条记录时,该字段记录之后的记录都自动减1?
datapub 2002-05-23
  • 打赏
  • 举报
回复
to shipatrioc(风吹雨打哗啦啦):

序号发生器如何生成呢?
如果在Oracle,或者Sql Server中!
pausing 2002-05-20
  • 打赏
  • 举报
回复
补充一点:
SQL> select * from csdnt where rowid='AAAY9oAAIAAACYlAAA';

GOODS PRICES DATES
-------------------- ---------- ----------
hp computer 25000 524
pausing 2002-05-20
  • 打赏
  • 举报
回复
我赞同弱水兄的看法!例:
SQL> select rowid from csdnt;

ROWID
------------------
AAAY9oAAIAAACYlAAA
AAAY9oAAIAAACYlAAB
AAAY9oAAIAAACYlAAC
AAAY9oAAIAAACYlAAD

delete from csdnt where dates=521;

SQL> select rowid from csdnt;

ROWID
------------------
AAAY9oAAIAAACYlAAB
AAAY9oAAIAAACYlAAC
AAAY9oAAIAAACYlAAD

insert into csdnt values('hp computer',25000,521);


SQL> select rowid from csdnt;

ROWID
------------------
AAAY9oAAIAAACYlAAB
AAAY9oAAIAAACYlAAC
AAAY9oAAIAAACYlAAD
AAAY9oAAIAAACYlAAE

delete from csdnt where rowid='AAAY9oAAIAAACYlAAD';


SQL> select rowid from csdnt;

ROWID
------------------
AAAY9oAAIAAACYlAAB
AAAY9oAAIAAACYlAAC
AAAY9oAAIAAACYlAAE

insert into csdnt values('hp computer',25000,524);


SQL> select rowid from csdnt;

ROWID
------------------
AAAY9oAAIAAACYlAAA
AAAY9oAAIAAACYlAAB
AAAY9oAAIAAACYlAAC
AAAY9oAAIAAACYlAAE

shipatrioc 2002-05-20
  • 打赏
  • 举报
回复
一个简单的方法就是再增加一个字段,该字段调用一个序号发生器。
然后求该字段的MAX
shipatrioc 2002-05-18
  • 打赏
  • 举报
回复
ROWID表示表中二进制地址,他是按你的插入顺序依次递增的
加载更多回复(18)

34,575

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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