首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

向大家请问,查询合适时间段中前两条数据

2013-01-11 
向大家请教,查询合适时间段中前两条数据举例来说明吧:表A门店编号供应商价格有效时间起有效时间止1001海鲜

向大家请教,查询合适时间段中前两条数据
举例来说明吧:
表A
  门店编号        供应商            价格          有效时间起           有效时间止
   1001           海鲜供应商        23            2012-09-01           2012-09-30
   1001           海鲜供应商        24.5          2012-10-01           2012-10-31
   1001           海鲜供应商        25.5          2012-10-05           2012-10-31
   1001           海鲜供应商        27            2012-10-15           2012-10-31
   1001           海鲜供应商        29.5          2012-11-01           2012-11-30

   1002           蔬菜供应商        4             2012-10-01           2012-10-30
   1002           蔬菜供应商        5.5           2012-10-05           2012-10-31
   1002           蔬菜供应商        6.5           2012-10-10           2012-10-31
   1002           蔬菜供应商        8             2012-10-15           2012-10-31
   1002           蔬菜供应商        9.5           2012-11-01           2012-11-30

这是一个调价表

以今天18号为例,查询2012-10-18各门店的供应商供货价格,下面能进入有效价格的数据
  门店编号        供应商            价格          有效时间起           有效时间止
   1001           海鲜供应商        24.5          2012-10-01           2012-10-31
   1001           海鲜供应商        25.5          2012-10-05           2012-10-31


   1001           海鲜供应商        27            2012-10-15           2012-10-31

   1002           蔬菜供应商        4             2012-10-01           2012-10-30
   1002           蔬菜供应商        5.5           2012-10-05           2012-10-31
   1002           蔬菜供应商        6.5           2012-10-10           2012-10-31
   1002           蔬菜供应商        8             2012-10-15           2012-10-31


但我想查询出最近两次调价的数据,达到如下效果 
  门店编号        供应商            价格          有效时间起           有效时间止
   1001           海鲜供应商        27            2012-10-15           2012-10-31
   1001           海鲜供应商        25.5          2012-10-05           2012-10-31   
   1002           蔬菜供应商        8             2012-10-15           2012-10-31
   1002           蔬菜供应商        6.5           2012-10-10           2012-10-31
[解决办法]
select b.* from 表A a
cross apply(select top 2 * from 表A 
     where 门店编号=a.门店编号 and 供应商=a.供应商 
                  and getdate() between 有效时间起 and 有效时间止 order by 有效时间起 desc) b
[解决办法]

if object_id('[A]') is not null drop table [A]
go
create table [A]([门店编号] int,[供应商] varchar(10),[价格] numeric(3,1),[有效时间起] datetime,[有效时间止] datetime)
insert [A]
select 1001,'海鲜供应商',23,'2012-09-01','2012-09-30' union all


select 1001,'海鲜供应商',24.5,'2012-10-01','2012-10-31' union all
select 1001,'海鲜供应商',25.5,'2012-10-05','2012-10-31' union all
select 1001,'海鲜供应商',27,'2012-10-15','2012-10-31' union all
select 1001,'海鲜供应商',29.5,'2012-11-01','2012-11-30' union all
select 1002,'蔬菜供应商',4,'2012-10-01','2012-10-30' union all
select 1002,'蔬菜供应商',5.5,'2012-10-05','2012-10-31' union all
select 1002,'蔬菜供应商',6.5,'2012-10-10','2012-10-31' union all
select 1002,'蔬菜供应商',8,'2012-10-15','2012-10-31' union all
select 1002,'蔬菜供应商',9.5,'2012-11-01','2012-11-30'
go

select *
from A t
where 有效时间起 in(
  select top 2 有效时间起 
   from a 
     where 门店编号=t.门店编号 and 供应商=t.供应商 and 有效时间起<='2012-10-18' 
       order by 有效时间起 desc
)
order by 门店编号,供应商,有效时间起 desc

/**
门店编号        供应商        价格                                      有效时间起                   有效时间止
----------- ---------- --------------------------------------- ----------------------- -----------------------
1001        海鲜供应商      27.0                                    2012-10-15 00:00:00.000 2012-10-31 00:00:00.000
1001        海鲜供应商      25.5                                    2012-10-05 00:00:00.000 2012-10-31 00:00:00.000
1002        蔬菜供应商      8.0                                     2012-10-15 00:00:00.000 2012-10-31 00:00:00.000
1002        蔬菜供应商      6.5                                     2012-10-10 00:00:00.000 2012-10-31 00:00:00.000

(4 行受影响)

**/


[解决办法]
SELECT MDBH, GYS, JG, STARTTIME, ENDTIME
  FROM (SELECT ROW_NUMBER() OVER(PARTITION BY GYS ORDER BY STARTTIME DESC) AS ROWNO,
               MDBH,
               GYS,
               JG,
               STARTTIME,


               ENDTIME
          FROM JG_TBL
         WHERE '2012-10-18' BETWEEN STARTTIME AND ENDTIME)
 WHERE ROWNO < 3

热点排行
Bad Request.