日期:2014-05-17  浏览次数:20489 次

同一表两条记录同一字段做比较的问题
一张sql表中的最新两条记录里的两个数字类型字段对比,最后一条比上一条的值大则输出上升,一样大输出持平 比上一条小则输出下降 这个数据查询怎么写?
------解决方案--------------------
引用:
Quote: 引用:

是这样吗:
if object_id('[tb]') is not null drop table [tb]
go 
create table [tb]([Id] int,[Name] varchar(3),[Result] int,[Date] datetime)
insert [tb]
select 1,'001',90,'2013-11-10' union all
select 2,'002',85,'2013-11-10' union all
select 3,'003',87,'2013-11-10' union all
select 4,'001',95,'2013-11-15' union all
select 5,'002',83,'2013-11-15' union all
select 6,'003',89,'2013-11-15' union all
select 7,'001',92,'2013-11-20' union ALL
select 8,'002',83,'2013-11-20' union all
select 9,'003',88,'2013-11-20'
go


;with t
as
(
select *,
       ROW_NUMBER() over(partition by [Name] order by [Date]) rownum
from tb
)

select t1.*,
       case when t1.[Result] > t2.[Result] then '上升'
            when t1.[Result] = t2.[Result] then '持平'
            when t1.[Result] < t2.[Result] then '下降'
       end flag
from t t1
left join t t2
       on t1.Name = t2.Name and t1.rownum = t2.rownum + 1
/*
Id Name Result Date rownum flag
1 001 90 2013-11-10 00:00:00.000 1 NULL
4 001 95 2013-11-15 00:00:00.000 2 上升
7 001 92 2013-11-20 00:00:00.000 3 下降
2 002 85 2013-11-10 00:00:00.000 1 NULL
5 002 83 2013-11-15 00:00:00.000 2 下降
8 002 83 2013-11-20 00:00:00.000 3 持平
3 003 87 2013-11-10 00:00:00.000 1 NULL
6 003 89 2013-11-15 00:00:00.000 2 上升
9 003 88 2013-11-20 00:00:00.000 3 下降
*/

基本上是这个意思,如果只想比较每个人最后两次的呢?最后只输出名字、最后一次结果和flag就行了,譬如
Name    Result      flag
001     92          下降
002 83          持平
003 88          下降


修改了一下,是这样吗:
if object_id('[tb]') is not null drop table [tb]
go 
create table [tb]([Id] int,[Name] varchar(3),[Result] int,[Date] datetime)
insert [tb]
select 1,'001',90,'2013-11-10' union all
select 2,'002',85,'2013-11-10' union all
select 3,'003',87,'2013-11-10' union all
select 4,'001',95,'2013-11-15' union all
select 5,'002',83,'2013-11-15' union all
select 6,'003',89,'2013-11-15' union all
select 7,'001',92,'2013-11-20' union ALL
select 8,'002',83,'2013-11-20' union all
select 9,'003',88,'2013-11-20'
go


;with t
as
(
select *,
       ROW_NUMBER() ove