求一句SQL语句的写法,不要存储过程

chanfengsr 2008-03-17 11:18:19

有一张表:
CREATE TABLE [dbo].[Invt] (
[InvtID] [char] (10) COLLATE SQL_Latin1_General_CP1_CI_AS NULL ,
[DataTime] [datetime] NULL ,
[UnitCost] [float] NULL
)

希望得到每个Invt以日期排序的前5个,(如果DataTime与UnitCost相同算一个)

例如:
数据如下:
INSERT INTO Invt(InvtID,DataTime,UnitCost)VALUES('A','2008-3-1',20)
INSERT INTO Invt(InvtID,DataTime,UnitCost)VALUES('A','2008-3-2',78)
INSERT INTO Invt(InvtID,DataTime,UnitCost)VALUES('A','2008-3-3',54)
INSERT INTO Invt(InvtID,DataTime,UnitCost)VALUES('A','2008-3-4',20)
INSERT INTO Invt(InvtID,DataTime,UnitCost)VALUES('A','2008-3-4',30)
INSERT INTO Invt(InvtID,DataTime,UnitCost)VALUES('A','2008-3-5',60)
INSERT INTO Invt(InvtID,DataTime,UnitCost)VALUES('A','2008-3-6',40)
INSERT INTO Invt(InvtID,DataTime,UnitCost)VALUES('B','2008-3-1',73)
INSERT INTO Invt(InvtID,DataTime,UnitCost)VALUES('B','2008-3-2',65)
INSERT INTO Invt(InvtID,DataTime,UnitCost)VALUES('B','2008-3-3',44)
INSERT INTO Invt(InvtID,DataTime,UnitCost)VALUES('B','2008-3-3',44)
INSERT INTO Invt(InvtID,DataTime,UnitCost)VALUES('B','2008-3-4',22)
INSERT INTO Invt(InvtID,DataTime,UnitCost)VALUES('B','2008-3-4',31)
INSERT INTO Invt(InvtID,DataTime,UnitCost)VALUES('B','2008-3-5',50)
INSERT INTO Invt(InvtID,DataTime,UnitCost)VALUES('B','2008-3-6',90)
INSERT INTO Invt(InvtID,DataTime,UnitCost)VALUES('B','2008-3-7',12)

应得到:
A 2008-03-06 40.0
A 2008-03-05 60.0
A 2008-03-04 20.0
A 2008-03-04 30.0
A 2008-03-03 54.0
B 2008-03-07 12.0
B 2008-03-06 90.0
B 2008-03-05 50.0
B 2008-03-04 22.0
B 2008-03-04 31.0
...全文
431 34 打赏 收藏 转发到动态 举报
写回复
用AI写文章
34 条回复
切换为时间正序
请发表友善的回复…
发表回复
chanfengsr 2008-03-19
  • 打赏
  • 举报
回复
回楼上的JiangHongTao,第二种方法不对,
第一种方法我稍微修正了下对了。不好意思,节贴了才发现的。
第一种方法甚是巧妙!!见识了!(虽然在主字段上使用了函数在数据量大的情况下会很慢)

改后的语句。
SELECT DISTINCT *
FROM invt t
WHERE checksum(*) IN (SELECT TOP 5 checksum(*)
FROM (
SELECT DISTINCT *
FROM invt
)i
WHERE i.invtid = t.invtid
ORDER BY
i.datatime DESC)
ORDER BY
invtid,
datatime DESC
chanfengsr 2008-03-17
  • 打赏
  • 举报
回复
回14楼的:这样用“[datatime] in ”肯定是不对的, 如果 100个InvtID为‘B’的datatime都是2007-01-01,而UnitCost 各不相同,这样的话其实只要取前5个就行了,但是用用“[datatime] in ”的话肯定是全部取出来了。

请大家用我八楼的数据得出数据下面的答案。

谢谢各位的帮助,我先去吃饭,吃完饭回来加分~~
flairsky 2008-03-17
  • 打赏
  • 举报
回复
A         	2007-03-06 00:00:00.000	40
A 2007-03-05 00:00:00.000 60
A 2007-03-04 00:00:00.000 20
A 2007-03-04 00:00:00.000 30
A 2007-03-03 00:00:00.000 54
B 2008-03-06 00:00:00.000 90
B 2008-03-05 00:00:00.000 50
B 2008-03-04 00:00:00.000 22
B 2008-03-04 00:00:00.000 31
B 2008-03-03 00:00:00.000 44
c 2009-03-07 00:00:00.000 42
c 2008-03-07 00:00:00.000 32
c 2007-03-07 00:00:00.000 22
c 2006-03-07 00:00:00.000 12
flairsky 2008-03-17
  • 打赏
  • 举报
回复
这样吧,唉,设计问题不小啊,勉强实现
drop table #invt
CREATE TABLE #Invt (
[InvtID] [char] (10) COLLATE SQL_Latin1_General_CP1_CI_AS NULL ,
[DataTime] [datetime] NULL ,
[UnitCost] [float] NULL
)
INSERT INTO #Invt(InvtID,DataTime,UnitCost)VALUES('A','2007-3-1',20)
INSERT INTO #Invt(InvtID,DataTime,UnitCost)VALUES('A','2007-3-2',78)
INSERT INTO #Invt(InvtID,DataTime,UnitCost)VALUES('A','2007-3-3',54)
INSERT INTO #Invt(InvtID,DataTime,UnitCost)VALUES('A','2007-3-4',20)
INSERT INTO #Invt(InvtID,DataTime,UnitCost)VALUES('A','2007-3-4',30)
INSERT INTO #Invt(InvtID,DataTime,UnitCost)VALUES('A','2007-3-5',60)
INSERT INTO #Invt(InvtID,DataTime,UnitCost)VALUES('A','2007-3-6',40)
INSERT INTO #Invt(InvtID,DataTime,UnitCost)VALUES('B','2008-3-1',73) ---这总差开了
INSERT INTO #Invt(InvtID,DataTime,UnitCost)VALUES('B','2008-3-2',65)
INSERT INTO #Invt(InvtID,DataTime,UnitCost)VALUES('B','2008-3-3',44)
INSERT INTO #Invt(InvtID,DataTime,UnitCost)VALUES('B','2008-3-3',44)
INSERT INTO #Invt(InvtID,DataTime,UnitCost)VALUES('B','2008-3-4',22)
INSERT INTO #Invt(InvtID,DataTime,UnitCost)VALUES('B','2008-3-4',31)
INSERT INTO #Invt(InvtID,DataTime,UnitCost)VALUES('B','2008-3-5',50)
INSERT INTO #Invt(InvtID,DataTime,UnitCost)VALUES('B','2008-3-6',90)
INSERT INTO #Invt(InvtID,DataTime,UnitCost)VALUES('c','2006-3-7',12) --弄个bt的
INSERT INTO #Invt(InvtID,DataTime,UnitCost)VALUES('c','2007-3-7',22)
INSERT INTO #Invt(InvtID,DataTime,UnitCost)VALUES('c','2008-3-7',32)
INSERT INTO #Invt(InvtID,DataTime,UnitCost)VALUES('c','2009-3-7',42)

select distinct * from #Invt t where [datatime] in (select top 5 [datatime] from #invt where invtid = t.invtid order by [datatime] desc) order by t.invtid , datatime desc
flairsky 2008-03-17
  • 打赏
  • 举报
回复
看了这个问题我不得不说一句

设计的好不好,看实现的困难不困难就可见一斑

这个问题总结出来不失一般性是这样的:
1、有n个invtid就会有n*m条记录,m为top数(有可能小于这个数,不影响结果)
2、要按照每个invtid进行时间上的排序
3、不能用临时表,少了个重要工具 - -!!
4、要做成视图,嵌套要少用……

唉,要多想想
nextflying 2008-03-17
  • 打赏
  • 举报
回复
有一张表:
CREATE TABLE [dbo].[Invt] (
[InvtID] [char] (10) COLLATE SQL_Latin1_General_CP1_CI_AS NULL ,
[DataTime] [datetime] NULL ,
[UnitCost] [float] NULL
)

希望得到每个Invt以日期排序的前5个,(如果DataTime与UnitCost相同算一个)

例如:
数据如下:
INSERT INTO Invt(InvtID,DataTime,UnitCost)VALUES('A','2008-3-1',20)
INSERT INTO Invt(InvtID,DataTime,UnitCost)VALUES('A','2008-3-2',78)
INSERT INTO Invt(InvtID,DataTime,UnitCost)VALUES('A','2008-3-3',54)
INSERT INTO Invt(InvtID,DataTime,UnitCost)VALUES('A','2008-3-4',20)
INSERT INTO Invt(InvtID,DataTime,UnitCost)VALUES('A','2008-3-4',30)
INSERT INTO Invt(InvtID,DataTime,UnitCost)VALUES('A','2008-3-5',60)
INSERT INTO Invt(InvtID,DataTime,UnitCost)VALUES('A','2008-3-6',40)
INSERT INTO Invt(InvtID,DataTime,UnitCost)VALUES('B','2008-3-1',73)
INSERT INTO Invt(InvtID,DataTime,UnitCost)VALUES('B','2008-3-2',65)
INSERT INTO Invt(InvtID,DataTime,UnitCost)VALUES('B','2008-3-3',44)
INSERT INTO Invt(InvtID,DataTime,UnitCost)VALUES('B','2008-3-3',44)
INSERT INTO Invt(InvtID,DataTime,UnitCost)VALUES('B','2008-3-4',22)
INSERT INTO Invt(InvtID,DataTime,UnitCost)VALUES('B','2008-3-4',31)
INSERT INTO Invt(InvtID,DataTime,UnitCost)VALUES('B','2008-3-5',50)
INSERT INTO Invt(InvtID,DataTime,UnitCost)VALUES('B','2008-3-6',90)
INSERT INTO Invt(InvtID,DataTime,UnitCost)VALUES('B','2008-3-7',12)

应得到:
A 2008-03-06 40.0
A 2008-03-05 60.0
A 2008-03-04 20.0
A 2008-03-04 30.0
A 2008-03-03 54.0
B 2008-03-07 12.0
B 2008-03-06 90.0
B 2008-03-05 50.0
B 2008-03-04 22.0
B 2008-03-04 31.0

不用SQL 查 , 大脑分析一下 , 你的结果是不是对呢?? 如果 认为对, 那就是本身我们理解不一致!! , 更谈不上解决问题了
nextflying 2008-03-17
  • 打赏
  • 举报
回复
加分吧 , 加完再续
nextflying 2008-03-17
  • 打赏
  • 举报
回复
希望得到每个Invt以日期排序的前5个,(如果DataTime与UnitCost相同算一个???????????????????)
chanfengsr 2008-03-17
  • 打赏
  • 举报
回复
很抱歉还是不对!!每个InvtID都要有5个,where Datatime in 的话显然是不对的 如果 100个InvtID为‘B’的datatime都是07-01-01的话你怎么办!!

请用以下数据:
INSERT INTO Invt(InvtID,DataTime,UnitCost)VALUES('A','2008-3-1',20)
INSERT INTO Invt(InvtID,DataTime,UnitCost)VALUES('A','2008-3-2',78)
INSERT INTO Invt(InvtID,DataTime,UnitCost)VALUES('A','2008-3-3',54)
INSERT INTO Invt(InvtID,DataTime,UnitCost)VALUES('A','2008-3-4',20)
INSERT INTO Invt(InvtID,DataTime,UnitCost)VALUES('A','2008-3-4',30)
INSERT INTO Invt(InvtID,DataTime,UnitCost)VALUES('A','2008-3-5',60)
INSERT INTO Invt(InvtID,DataTime,UnitCost)VALUES('A','2008-3-6',40)
INSERT INTO Invt(InvtID,DataTime,UnitCost)VALUES('A','2008-3-6',40)
INSERT INTO Invt(InvtID,DataTime,UnitCost)VALUES('B','2008-4-1',73)
INSERT INTO Invt(InvtID,DataTime,UnitCost)VALUES('B','2008-4-7',12)
INSERT INTO Invt(InvtID,DataTime,UnitCost)VALUES('B','2008-4-2',65)
INSERT INTO Invt(InvtID,DataTime,UnitCost)VALUES('B','2008-4-3',44)
INSERT INTO Invt(InvtID,DataTime,UnitCost)VALUES('B','2008-4-3',44)
INSERT INTO Invt(InvtID,DataTime,UnitCost)VALUES('B','2008-4-4',22)
INSERT INTO Invt(InvtID,DataTime,UnitCost)VALUES('B','2008-4-4',31)
INSERT INTO Invt(InvtID,DataTime,UnitCost)VALUES('B','2008-4-5',50)
INSERT INTO Invt(InvtID,DataTime,UnitCost)VALUES('B','2008-4-6',90)
INSERT INTO Invt(InvtID,DataTime,UnitCost)VALUES('B','2008-4-7',12)

得出以下结论:
A 2008-03-06 00:00:00.000 40.0
A 2008-03-05 00:00:00.000 60.0
A 2008-03-04 00:00:00.000 20.0
A 2008-03-04 00:00:00.000 30.0
A 2008-03-03 00:00:00.000 54.0
B 2008-04-07 00:00:00.000 12.0
B 2008-04-06 00:00:00.000 90.0
B 2008-04-05 00:00:00.000 50.0
B 2008-04-04 00:00:00.000 22.0
B 2008-04-04 00:00:00.000 31.0


看来要加分了~~
nextflying 2008-03-17
  • 打赏
  • 举报
回复
select * from Invt where Datatime in ( select Datatime from (select distinct top 5 * , (DataTime + UnitCost / 100.0) s from Invt order by s desc) t )

OK??
chanfengsr 2008-03-17
  • 打赏
  • 举报
回复
拜托,5楼的大哥,我说得应该蛮清楚的,是“每个Invt以日期排序的前5个”,不是总共5个!!
nextflying 2008-03-17
  • 打赏
  • 举报
回复

select distinct top 5 * , (DataTime + UnitCost / 100.0) s from Invt order by s desc
chanfengsr 2008-03-17
  • 打赏
  • 举报
回复
两位回答的都不对,InvtID可能有很多不能简单的 top 10 ,每个InvtID的datatime可能相差很多,比如100个InvtID为‘A’的datatime 是从06-01-01至06-12-30,而100个InvtID为‘B’的datatime是从07-01-01至07-12-30的,所以二楼的做法也是不对的。
nextflying 2008-03-17
  • 打赏
  • 举报
回复
select top 10 * from Invt order by (DataTime + UnitCost / 100.0) desc
chanfengsr 2008-03-17
  • 打赏
  • 举报
回复
补充一下,不要建临表,这句SQL语句要进视图的
dawugui 2008-03-17
  • 打赏
  • 举报
回复
CREATE TABLE [dbo].[Invt] ( 
[InvtID] [char] (10) COLLATE SQL_Latin1_General_CP1_CI_AS NULL ,
[DataTime] [datetime] NULL ,
[UnitCost] [float] NULL
)
INSERT INTO Invt(InvtID,DataTime,UnitCost)VALUES('A','2008-3-1',20)
INSERT INTO Invt(InvtID,DataTime,UnitCost)VALUES('A','2008-3-2',78)
INSERT INTO Invt(InvtID,DataTime,UnitCost)VALUES('A','2008-3-3',54)
INSERT INTO Invt(InvtID,DataTime,UnitCost)VALUES('A','2008-3-4',20)
INSERT INTO Invt(InvtID,DataTime,UnitCost)VALUES('A','2008-3-4',30)
INSERT INTO Invt(InvtID,DataTime,UnitCost)VALUES('A','2008-3-5',60)
INSERT INTO Invt(InvtID,DataTime,UnitCost)VALUES('A','2008-3-6',40)
INSERT INTO Invt(InvtID,DataTime,UnitCost)VALUES('B','2008-3-1',73)
INSERT INTO Invt(InvtID,DataTime,UnitCost)VALUES('B','2008-3-2',65)
INSERT INTO Invt(InvtID,DataTime,UnitCost)VALUES('B','2008-3-3',44)
INSERT INTO Invt(InvtID,DataTime,UnitCost)VALUES('B','2008-3-3',44)
INSERT INTO Invt(InvtID,DataTime,UnitCost)VALUES('B','2008-3-4',22)
INSERT INTO Invt(InvtID,DataTime,UnitCost)VALUES('B','2008-3-4',31)
INSERT INTO Invt(InvtID,DataTime,UnitCost)VALUES('B','2008-3-5',50)
INSERT INTO Invt(InvtID,DataTime,UnitCost)VALUES('B','2008-3-6',90)
INSERT INTO Invt(InvtID,DataTime,UnitCost)VALUES('B','2008-3-7',12)
go

select * from Invt t where [datatime] in (select top 5 [datatime] from invt where invtid = t.invtid order by [datatime] desc) order by t.invtid , datatime desc

drop table Invt

/*
InvtID DataTime UnitCost
---------- ------------------------------------------------------ -----------------------------------------------------
A 2008-03-06 00:00:00.000 40.0
A 2008-03-05 00:00:00.000 60.0
A 2008-03-04 00:00:00.000 30.0
A 2008-03-04 00:00:00.000 20.0
A 2008-03-03 00:00:00.000 54.0
B 2008-03-07 00:00:00.000 12.0
B 2008-03-06 00:00:00.000 90.0
B 2008-03-05 00:00:00.000 50.0
B 2008-03-04 00:00:00.000 31.0
B 2008-03-04 00:00:00.000 22.0

(所影响的行数为 10 行)
*/
JiangHongTao 2008-03-17
  • 打赏
  • 举报
回复
1.
select distinct * from invt t
where checksum(*) in (select top 5 checksum(*) from invt where invtid=t.invtid order by datatime desc)
order by invtid,datatime desc

2.
select distinct * from  invt t
where (select count(distinct unitcost) from invt where invtid=t.invtid and datatime >=t.datatime) <=5
order by invtid,datatime desc
dawugui 2008-03-17
  • 打赏
  • 举报
回复
CREATE TABLE [Invt] (  
[InvtID] [char] (10) NOT NULL ,
[DataTime] [datetime] NOT NULL ,
[UnitCost] [float] NOT NULL
)
INSERT INTO Invt(InvtID,DataTime,UnitCost)VALUES('A','2008-3-1',20)
INSERT INTO Invt(InvtID,DataTime,UnitCost)VALUES('A','2008-3-2',78)
INSERT INTO Invt(InvtID,DataTime,UnitCost)VALUES('A','2008-3-3',54)
INSERT INTO Invt(InvtID,DataTime,UnitCost)VALUES('A','2008-3-4',20)
INSERT INTO Invt(InvtID,DataTime,UnitCost)VALUES('A','2008-3-4',30)
INSERT INTO Invt(InvtID,DataTime,UnitCost)VALUES('A','2008-3-5',60)
INSERT INTO Invt(InvtID,DataTime,UnitCost)VALUES('A','2008-3-6',40)
INSERT INTO Invt(InvtID,DataTime,UnitCost)VALUES('B','2008-3-1',73)
INSERT INTO Invt(InvtID,DataTime,UnitCost)VALUES('B','2008-3-2',65)
INSERT INTO Invt(InvtID,DataTime,UnitCost)VALUES('B','2008-3-3',44)
INSERT INTO Invt(InvtID,DataTime,UnitCost)VALUES('B','2008-3-3',44)
INSERT INTO Invt(InvtID,DataTime,UnitCost)VALUES('B','2008-3-4',22)
INSERT INTO Invt(InvtID,DataTime,UnitCost)VALUES('B','2008-3-4',31)
INSERT INTO Invt(InvtID,DataTime,UnitCost)VALUES('B','2008-3-5',50)
INSERT INTO Invt(InvtID,DataTime,UnitCost)VALUES('B','2008-3-6',90)
INSERT INTO Invt(InvtID,DataTime,UnitCost)VALUES('B','2008-3-7',12)

go

select * from
(
select distinct * from invt
) m where datatime in
(
select top 5 datatime from
(
select distinct * from invt
) n
where invtid = m.invtid order by datatime desc
)

drop table invt

/*
InvtID DataTime UnitCost
---------- ------------------------------------------------------ -----------------------------------------------------
A 2008-03-03 00:00:00.000 54.0
A 2008-03-04 00:00:00.000 20.0
A 2008-03-04 00:00:00.000 30.0
A 2008-03-05 00:00:00.000 60.0
A 2008-03-06 00:00:00.000 40.0
B 2008-03-04 00:00:00.000 22.0
B 2008-03-04 00:00:00.000 31.0
B 2008-03-05 00:00:00.000 50.0
B 2008-03-06 00:00:00.000 90.0
B 2008-03-07 00:00:00.000 12.0

(所影响的行数为 10 行)
*/
loworth 2008-03-17
  • 打赏
  • 举报
回复
jf
BILearner 2008-03-17
  • 打赏
  • 举报
回复
.......能指点一下,我错在了哪里?
加载更多回复(14)
源码链接: https://pan.quark.cn/s/8ddf8a1c92f9 **libcurl用于获取大型文件**libcurl作为一个开源的C语言库,提供了一系列的API来处理与URL相关的任务,涵盖了HTTP、FTP、SMTP等多种网络协议的应用。在执行大型文件的下载操作时,libcurl展现出卓越的性能表现和高度的灵活性,能够高效地管理大文件传输过程,有效预防内存溢出及其他潜在问题。**libcurl的基础操作**libcurl的基础应用包括以下几个环节:1. **初始化**:需要借助`curl_global_init()`函数来启动libcurl的工作环境。2. **建立会话句柄**:通过`curl_easy_init()`函数创建一个会话句柄,该句柄将用于后续所有的操作流程。3. **配置选项**:运用`curl_easy_setopt()`函数来设定多种参数,例如目标URL、超时时间、重试次数以及数据写入的回调函数等。4. **执行请**:调用`curl_easy_perform()`函数来实施下载操作。5. **释放资源**:使用`curl_easy_cleanup()`函数来释放已经占用的资源。**获取大型文件时的重要设置**1. **数据写入回调函数**:在处理大型文件下载时,通常不希望一次性将整个文件载入内存。可以配置`CURLOPT_WRITEFUNCTION`选项,指定一个回调函数来处理接收到的数据片段,这样libcurl在接收到数据时会调用该函数,使得我们可以按需将数据写入文件或缓冲区。2. **缓冲策略**:可以设定缓冲区的大小(比如,通过`CURLOPT_BUFFERSIZE`),来控制每次接收数据的数量,从而优化内存...
内容概要:本文档整合了《鬼谷子·决篇》与《三略·审权变第三》《差德行第四》三大古代智慧典籍,构建了一套“决策+形势+用人”三位一体的领导力提升体系。通过28天三合实战路径、三维诊断工具、9个实用模板及独特的“身体锚点”仪式,系统解决管理者在决策犹豫、形势误判、人岗错配等方面的痛点。全文涵盖理论溯源、方法论拆解(如三步决策法、审权变四步法、差德行四步法)、历史案例对照(范蠡 vs 项羽)以及跨资源联动建议,形成从认知到实践的完整闭环。; 适合人群:中基层管理者、创业者、职场进阶者,尤其是面临决策困境、环境适应困难或团队用人问题的人群;具备一定管理经验或自我提升意识的个体亦可受益。; 使用场景及目标:① 提升重大事项的决策质量,避免反复纠结与事后后悔;② 增强对外部环境变化的敏感度与应对能力,实现灵活调整;③ 科学评估人才德才素质,实现人岗精准匹配,减少用人失误;④ 构建个人化的决策-应变-用人标准化流程(SOP)。; 阅读建议:建议按照28天路径逐步实践,结合自测表定位短板,优先突破薄弱模块;配套工具模板需实际填写使用,配合身体锚点仪式强化行为记忆;可与“诸葛亮决策术”“立将威信术”等单品联动,全面提升领导力体系。

34,876

社区成员

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

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