Sql 查找最新更新日期的竞争对手价格

Sql 查找最新更新日期的竞争对手价格,sql,sql-server,Sql,Sql Server,我正在尝试从具有不同上次检查日期时间戳的表中查找项目的最新竞争对手价格 我正在试图找到OKJ卖家的价格和最新更新的上次检查日期的该商品的最低价格 Isbb表示最低价格 如果amxcd是最新时间戳更新中某个项目的卖家,则我不应选择该项目,如果最新时间戳日期的某个项目的isfba=1,则我不应选择该项目 我还需要计算我选择的商品的卖家数量 如果okj是最新时间戳日期的竞争对手,则我需要说“是”或“否” -输入表 create table #input (itemid varchar(50), sel

我正在尝试从具有不同上次检查日期时间戳的表中查找项目的最新竞争对手价格

我正在试图找到OKJ卖家的价格和最新更新的上次检查日期的该商品的最低价格

Isbb表示最低价格

如果amxcd是最新时间戳更新中某个项目的卖家,则我不应选择该项目,如果最新时间戳日期的某个项目的isfba=1,则我不应选择该项目

我还需要计算我选择的商品的卖家数量

如果okj是最新时间戳日期的竞争对手,则我需要说“是”或“否”

-输入表

create table #input
(itemid varchar(50),
seller varchar(30),
price int,
last_checked datetime2,
is_bb int,
isfba int
)

insert into #input 
values
('bclpa','amxcd','89','2019-07-17 14:04:00.000','1','1'),
('bclpa','cvbd','100','2019-07-17 14:04:00.000','0','0'),
('lpatt','cvbd','78','2019-04-17 14:04:00.000','0','0'),
('lpatt','bnhj','60','2019-04-17 14:04:00.000','1','0'),
('lpatt','okj','90','2019-04-17 14:04:00.000','0','0'),
('lpatt','cvbd','70','2018-04-17 14:04:00.000','1','0'),
('lpatt','hjnk','90','2018-04-17 14:04:00.000','0','1'),
('cjatt','klmn','45','2019-04-17 14:04:00.000','1','0'),
('cjatt','njkl','89','2019-04-17 14:04:00.000','0','1'),
('cjatt','lket','40','2018-04-17 14:04:00.000','1','0'),
('cjatt','jklop','76','2018-04-17 14:04:00.000','0','0'),
('tilo','okj','56','2019-02-17 14:04:00.000','1','0'),
('tilo','jklop','70','2019-02-17 14:04:00.000','0','0'),
('tilo','hjkl','88','2019-02-17 14:04:00.000','0','0'),
('tilo','amxcd','32','2018-02-17 14:04:00.000','1','0'),
('jkatt','jklop','22','2018-02-17 14:04:00.000','1','0'),
('jkatt','amxcd','56','2018-02-17 14:04:00.000','0','0'),
('katt','hjkl','90','2019-02-17 14:04:00.000','1','0'),
('katt','lklo','99','2019-02-17 14:04:00.000','0','0'),
('katt','bnm','108','2019-02-17 14:04:00.000','0','0'),
('katt','okj','78','2018-02-17 14:04:00.000','1','0'),
('katt','nmsd','80','2018-02-17 14:04:00.000','0','0')
--Ouptut表

create table #output
( itemid varchar(50),
okjprice int,
lowestprice int,
noofcompetitors int,
isokjacompetetior varchar(20)
)

insert into #output values
('lpatt','90','60','3','Yes'),
('tilo','56','56','3','yes'),
('katt','','90','3','No')

我认为这实现了你描述的逻辑。但是,它包括两个附加项目:

select itemid,
       min(case when seller = 'okj' then price end) as okj_price,
       min(price) as min_price,
       sum(is_bb) as num_competitors,
       max(case when is_bb = 1 and seller = 'okj' then 'yes' else 'no' end) as isokjcompetitor
from (select i.*,
             first_value(seller) over (partition by itemid order by last_checked desc) as last_seller,
             first_value(isfba) over (partition by itemid order by last_checked desc) as last_isfba
      from input i
     ) i
where last_isfba <> 1 and last_seller <> 'amxcd'
group by itemid;

根据您的描述,cjatt和kjatt应该在结果集中。

您可以尝试此查询:

;WITH    CTE
          AS ( SELECT   A.itemid ,A.seller ,A.price ,A.last_checked ,A.is_bb ,A.isfba ,
                        CASE WHEN A.seller = 'okj' THEN A.price ELSE 0 END AS okjPrice ,
                        DENSE_RANK() OVER ( PARTITION BY A.itemid ORDER BY A.last_checked DESC ) GrpID ,
                        ROW_NUMBER() OVER ( PARTITION BY A.itemid ORDER BY A.last_checked DESC, A.is_bb DESC, A.price ASC ) RowID
               FROM     #input A
             )
    SELECT  A.itemid , OP.okjPrice , A.price AS lowestprice , OP.Cnt AS noofcompetitors ,
            CASE WHEN OP.okjPrice > 0 THEN 'Yes' ELSE 'No' END AS isokjacompetetior
    FROM    CTE A
            INNER JOIN ( SELECT CTE.itemid , MAX(CTE.okjPrice) okjPrice ,
                                COUNT(*) AS Cnt
                         FROM   CTE
                         WHERE  CTE.GrpID = 1
                         GROUP BY CTE.itemid
                       ) OP ON OP.itemid = A.itemid
    WHERE   A.RowID = 1
            AND A.isfba <> 1;

@一匹没有名字的马:我正在使用SQL server management studio 2018。你能发布你到目前为止尝试过的查询吗?@mkrabbani:its,cte为select*,分区上的行数按项目ID顺序按上次检查的描述从输入中选择*从cte中选择,其中rn=1,卖方不在输入中选择卖方,其中卖方=amxcd'和isfba 1,并且是\u bb=1。对于项目ID=bclpa,两个上次检查的值相同。如果其中任何一个以行号Order BY开头,您是否同意?谢谢@Pawan GuptaThank@Gordon Linoff
itemid  okjPrice    lowestprice noofcompetitors isokjacompetetior
cjatt       0           45          2               No
jkatt       0           22          2               No
katt        0           90          3               No
lpatt       90          60          3               Yes
tilo        56          56          3               Yes