新足迹

 找回密码
 注册

精华好帖回顾

· 我的小儿感冒发烧咳嗽对策:中医与饮食调理。要重视预防!父母是孩子最好的医生!! (2009-1-5) 海边小妹 · 煮夫手记三十 豆腐两吃 (2011-7-14) amon54
· 日本的照片(二)—— 本州的山水 (2010-6-3) 老陶 · 豉汁盘龙鳝(坑已填) (2005-3-6) susan
Advertisement
Advertisement
查看: 2792|回复: 62

[IT] 那位SQL达人能解这个?? [复制链接]

头像被屏蔽

禁止发言

发表于 2010-4-14 11:50 |显示全部楼层
此文章由 澳贼 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 澳贼 所有!转贴必须注明作者、出处和本声明,并保持内容完整
a table
3 columns
acccountID, recordDate, price
how to get the latest price(max recordDate) for each account ID?

Advertisement
Advertisement

发表于 2010-4-14 11:57 |显示全部楼层
此文章由 zn7726 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 zn7726 所有!转贴必须注明作者、出处和本声明,并保持内容完整
澳贼你没事吧? 是不是当初database的作业你是抄别人的?

select * from TABLE_NAME t
where t.recordDate = (select max(tt.recordDate) from TABLE_NAME tt where t.accountID = tt.accountID)

评分

参与人数 1积分 +4 收起 理由
澳贼 + 4 鼓励

查看全部评分

发表于 2010-4-14 12:00 |显示全部楼层
此文章由 happysee 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 happysee 所有!转贴必须注明作者、出处和本声明,并保持内容完整
select  tableName.accountID,tableName.price
from tableName
inner join
(
select accountID,max(recordDate) recordDate
from tableName
group by accountID
) t on tableName.accountID=t.accountID and tableName.recordDate=t.recordDate

评分

参与人数 1积分 +3 收起 理由
澳贼 + 3 鼓励

查看全部评分

发表于 2010-4-14 12:04 |显示全部楼层
此文章由 zn7726 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 zn7726 所有!转贴必须注明作者、出处和本声明,并保持内容完整
澳贼是搞asp.net的, 估计3楼的SQLSERVER版本更和胃口?

发表于 2010-4-14 12:07 |显示全部楼层
此文章由 AmandaX 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 AmandaX 所有!转贴必须注明作者、出处和本声明,并保持内容完整
呵呵 asp.net 80% 都是sql server后台呀?

我也来问问
table 50万条记录 2楼和3楼谁的效率高?

发表于 2010-4-14 12:09 |显示全部楼层
此文章由 zn7726 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 zn7726 所有!转贴必须注明作者、出处和本声明,并保持内容完整
估计是三楼效率高
Advertisement
Advertisement
头像被屏蔽

禁止发言

发表于 2010-4-14 12:11 |显示全部楼层
此文章由 澳贼 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 澳贼 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 zn7726 于 2010-4-14 10:57 发表
澳贼你没事吧? 是不是当初database的作业你是抄别人的?

select * from TABLE_NAME t
where t.recordDate = (select max(tt.recordDate) from TABLE_NAME tt where t.accountID = tt.accountID)


遗憾的告诉你,错了。
签名被屏蔽
头像被屏蔽

禁止发言

发表于 2010-4-14 12:13 |显示全部楼层

达人的答案

此文章由 澳贼 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 澳贼 所有!转贴必须注明作者、出处和本声明,并保持内容完整

发表于 2010-4-14 12:13 |显示全部楼层
此文章由 happysee 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 happysee 所有!转贴必须注明作者、出处和本声明,并保持内容完整
如果SQL SERVER足够聪明的话效率应该是一样的吧.

发表于 2010-4-14 12:13 |显示全部楼层
此文章由 jingsun 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 jingsun 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 zn7726 于 2010-4-14 10:57 发表
澳贼你没事吧? 是不是当初database的作业你是抄别人的?

select * from TABLE_NAME t
where t.recordDate = (select max(tt.recordDate) from TABLE_NAME tt where t.accountID = tt.accountID)


不能说“明显不对”。。。呵呵。。。

[ 本帖最后由 jingsun 于 2010-4-14 11:56 编辑 ]

发表于 2010-4-14 12:14 |显示全部楼层
此文章由 zn7726 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 zn7726 所有!转贴必须注明作者、出处和本声明,并保持内容完整
达人果然够严谨
Advertisement
Advertisement

发表于 2010-4-14 12:18 |显示全部楼层
此文章由 AmandaX 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 AmandaX 所有!转贴必须注明作者、出处和本声明,并保持内容完整
在问一个问题 sq2005后台 nolock
单靠 accountid 和 recorddate 就能唯一确定latest price?
同一时间都向一个accountid输入信息 会不会造成2个latest price?

发表于 2010-4-14 12:19 |显示全部楼层
此文章由 AmandaX 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 AmandaX 所有!转贴必须注明作者、出处和本声明,并保持内容完整
哦 看来我和达人想到一起了 哈哈
头像被屏蔽

禁止发言

发表于 2010-4-14 12:20 |显示全部楼层
此文章由 澳贼 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 澳贼 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 AmandaX 于 2010-4-14 11:18 发表
在问一个问题 sq2005后台 nolock
单靠 accountid 和 recorddate 就能唯一确定latest price?
同一时间都向一个accountid输入信息 会不会造成2个latest price?


会,严谨,是个达人
签名被屏蔽

发表于 2010-4-14 12:20 |显示全部楼层
此文章由 happysee 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 happysee 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 jingsun 于 2010-4-14 11:13 发表


明显不对。。。

且不去说maxdate有多个价格的情况, 似乎他这个没有什么问题呀.

发表于 2010-4-14 12:23 |显示全部楼层
此文章由 happysee 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 happysee 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 AmandaX 于 2010-4-14 11:18 发表
在问一个问题 sq2005后台 nolock
单靠 accountid 和 recorddate 就能唯一确定latest price?
同一时间都向一个accountid输入信息 会不会造成2个latest price?

这个是表格设计本身的问题.
Advertisement
Advertisement

发表于 2010-4-14 12:24 |显示全部楼层
此文章由 zn7726 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 zn7726 所有!转贴必须注明作者、出处和本声明,并保持内容完整
澳贼, 你这题有问题呀.
你先说说primary key是哪个? 我的答案假设PK是 acc_ID + record_date

2008年度奖章获得者

发表于 2010-4-14 12:27 |显示全部楼层
此文章由 degra 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 degra 所有!转贴必须注明作者、出处和本声明,并保持内容完整
这个行不行:
select accountID, max(recordDATE),price from TABLE group by accountID

发表于 2010-4-14 12:28 |显示全部楼层
此文章由 happysee 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 happysee 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 gandu 于 2010-4-14 11:27 发表
这个行不行:
select accountID, max(recordDATE),price from TABLE group by accountID

不行,select里面的必须是group by里面有的,或者是 aggregation
头像被屏蔽

禁止发言

发表于 2010-4-14 12:29 |显示全部楼层
此文章由 澳贼 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 澳贼 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 gandu 于 2010-4-14 11:27 发表
这个行不行:
select accountID, max(recordDATE),price from TABLE group by accountID


逻辑错误
签名被屏蔽

发表于 2010-4-14 12:29 |显示全部楼层
此文章由 AmandaX 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 AmandaX 所有!转贴必须注明作者、出处和本声明,并保持内容完整
楼上不能compile
Advertisement
Advertisement

发表于 2010-4-14 12:30 |显示全部楼层
此文章由 zn7726 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 zn7726 所有!转贴必须注明作者、出处和本声明,并保持内容完整
灌版那个会报错, group by有问题

发表于 2010-4-14 12:30 |显示全部楼层
此文章由 jingsun 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 jingsun 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 happysee 于 2010-4-14 11:20 发表

且不去说maxdate有多个价格的情况, 似乎他这个没有什么问题呀.


运行一下试试,我没MSSQL,给不出output。

发表于 2010-4-14 12:31 |显示全部楼层
此文章由 AmandaX 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 AmandaX 所有!转贴必须注明作者、出处和本声明,并保持内容完整
看来it人士不少亚

发表于 2010-4-14 12:34 |显示全部楼层
此文章由 zn7726 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 zn7726 所有!转贴必须注明作者、出处和本声明,并保持内容完整
明显不对。。。

为啥??? 有那么明显吗
假如pk是acc_ID + record_date哪?

如果pk不是acc_ID + record_date, 那还能是啥? 除非就是没PK

发表于 2010-4-14 12:45 |显示全部楼层
此文章由 jingsun 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 jingsun 所有!转贴必须注明作者、出处和本声明,并保持内容完整
select max(tt.recordDate) from TABLE_NAME tt where t.accountID = tt.accountID

这样引用,似乎很不好。。。
Advertisement
Advertisement

发表于 2010-4-14 12:46 |显示全部楼层
此文章由 happysee 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 happysee 所有!转贴必须注明作者、出处和本声明,并保持内容完整
我刚才测试了一下, 2楼和3楼得到的是一样的结果,执行计划也相同. 2 楼的语法简洁,3楼的更能清楚的表明意图.

发表于 2010-4-14 12:47 |显示全部楼层
此文章由 AmandaX 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 AmandaX 所有!转贴必须注明作者、出处和本声明,并保持内容完整
zn7726的错误和pk没关系
是逻辑错误
再想想
哈哈

发表于 2010-4-14 12:49 |显示全部楼层
此文章由 zn7726 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 zn7726 所有!转贴必须注明作者、出处和本声明,并保持内容完整
这样引用,似乎很不好。。。


这次不说"明显不对"了?

发表于 2010-4-14 12:50 |显示全部楼层
此文章由 happysee 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 happysee 所有!转贴必须注明作者、出处和本声明,并保持内容完整
CREATE TABLE [dbo].[tableName](
        [accountID] [int] NOT NULL,
        [recordDate] [datetime] NOT NULL,
        [price] [int] NULL,
CONSTRAINT [PK_tableName] PRIMARY KEY CLUSTERED
(
        [accountID] ASC,
        [recordDate] ASC
)

insert into tableName values (1,'2010-4-10',555)
insert into tableName values (1,'2010-4-11',666)
insert into tableName values (2,'2010-4-12',777)
insert into tableName values (2,'2010-4-13',888)

select * from tableName t
where t.recordDate = (select max(tt.recordDate) from tableName tt where t.accountID = tt.accountID)

select  tableName.accountID,tableName.price
from tableName
inner join
(
select accountID,max(recordDate) recordDate
from tableName
group by accountID
) t on tableName.accountID=t.accountID and tableName.recordDate=t.recordDate

drop table tableName

[ 本帖最后由 happysee 于 2010-4-14 11:51 编辑 ]

发表回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Advertisement
Advertisement
返回顶部