Sql 选择i.ITEM\u ID、i.ITEM\u NAME、i.START\u VALUE、c.MAX\u BID\u NAME、c.MAX\u BID\u VALUE、c.BID\u TIME 来自#项目一 在c.ITEM\u ID=i.ITEM\u ID上

Sql 选择i.ITEM\u ID、i.ITEM\u NAME、i.START\u VALUE、c.MAX\u BID\u NAME、c.MAX\u BID\u VALUE、c.BID\u TIME 来自#项目一 在c.ITEM\u ID=i.ITEM\u ID上,sql,performance,compare,db2-luw,Sql,Performance,Compare,Db2 Luw,选择i.ITEM\u ID、i.ITEM\u NAME、i.START\u VALUE、c.MAX\u BID\u NAME、c.MAX\u BID\u VALUE、c.BID\u TIME 来自#项目一 在c.ITEM\u ID=i.ITEM\u ID上左连接最终c 我需要找到拍卖结束日期前的最高出价。你似乎没有考虑这个问题?我错过了。我修正了它,假设拍卖结束是最后一天。拍卖结束日期不是最后一天。拍卖结束日期后的出价不应包括在内。@user3155036。这使得where条款变得更加复杂。我编

选择i.ITEM\u ID、i.ITEM\u NAME、i.START\u VALUE、c.MAX\u BID\u NAME、c.MAX\u BID\u VALUE、c.BID\u TIME 来自#项目一 在c.ITEM\u ID=i.ITEM\u ID上左连接最终c
我需要找到拍卖结束日期前的最高出价。你似乎没有考虑这个问题?我错过了。我修正了它,假设拍卖结束是最后一天。拍卖结束日期不是最后一天。拍卖结束日期后的出价不应包括在内。@user3155036。这使得
where
条款变得更加复杂。我编辑了我的答案以考虑拍卖结束日期。希望这有帮助。我需要找到拍卖结束日期前的最高出价。你似乎没有考虑这个问题?我错过了。我修正了它,假设拍卖结束是最后一天。拍卖结束日期不是最后一天。拍卖结束日期后的出价不应包括在内。@user3155036。这使得
where
条款变得更加复杂。我编辑了我的答案以考虑拍卖结束日期。希望对你有所帮助。有些出价是在拍卖结束日期之后列出的。但仅应报告各组在拍卖结束前的出价。此处列出的出价在拍卖结束日期后。但仅应报告各组在拍卖结束前的出价
ITEM_ID | ITEM_NAME | START_VALUE
  A1324 | item1     | 113
  B4534 | item3     | 50
  A3453 | item7     | 35
  A7654 | item2     | 48
ITEM_ID | BIDDER_NAME | BID_VALUE | BID_TIME
  A7654 | Jessica     | 53        | 2016-02-02 14:28:43
  B4534 | John        | 69        | 2016-01-03 08:03:06
  B4534 | Annie       | 63        | 2016-01-02 15:23:27
  B4534 | Tim         | 65        | 2016-01-01 18:15:02
  B4534 | AuctionEnd  | 50        | 2016-01-02 19:45:34
  A7654 | Mark        | 52        | 2016-02-02 16:51:12  
 ITEM_ID|ITEM_NAME|START_VALUE|MAX_BIDDER_NAME|MAX_BID_VALUE|BID_TIME
  A1324 | item1   | 113       |null           |null         |0
  B4534 | item3   | 50        |Tim            |65           |2016-01-01 18:15:02
  A3453 | item7   | 35        |null           |null         |0
  A7654 | item2   | 48        |Jessica        |53           |2016-02-02 14:28:43
select i.*, b.*
from items i left join
     (select b.item_id, max(b.bid_time) as maxbt
      from bids b
      where b.bid_time < (select max(b.bid_time)
                          from bids b2
                          where b2.bidder_name = 'AuctionEnd' and
                                b2.item_id = b.item_id
                         )
      group by b.item_id
     ) bb
     on i.item_id = bb.item_id left join
     bids b
     on b.item_item = i.item_id and b.bid_time = b.maxbt;
  CREATE TABLE #ITEMS (ITEM_ID varchar(10), ITEM_NAME varchar(10), START_VALUE int)
  INSERT INTO #ITEMS
  VALUES
  ('A1324','item1',113),
  ('B4534','item3',50),
  ('A3453','item7',35),
  ('A7654','item2',48)


  CREATE TABLE #BIDS (ITEM_ID varchar(10), BIDDER_NAME varchar(50), BID_VALUE int, BID_TIME datetime)
  INSERT INTO #BIDS
  VALUES
  ('A7654','Jessica',53,'2016-02-02 14:28:43'),
  ('B4534','John',69,'2016-01-03 08:03:06'),
  ('B4534','Annie',63,'2016-01-02 15:23:27'),
  ('B4534','Tim',65,'2016-01-01 18:15:02'),
  ('B4534','AuctionEnd',50,'2016-01-02 19:45:34'),
  ('A7654','Mark',52,'2016-02-02 16:51:12')


;WITH cteEndTime as
(
    Select 
        ITEM_ID,
        CASE WHEN BIDDER_NAME = 'AuctionEnd' THEN BID_TIME ELSE NULL END as 'END_BID_TIME'
    From #BIDS
    Where BIDDER_NAME = 'AuctionEnd'
)

,cteValidBIDS as
(Select * From (
    Select bd.ITEM_ID, bd.BIDDER_NAME, bd.BID_VALUE, bd.BID_TIME,
        ROW_NUMBER() over (partition by bd.ITEM_ID order by BID_TIME) as 'brnk',
        c.END_BID_TIME
    FROM #BIDS bd
    LEFT JOIN cteEndTime c on c.ITEM_ID = bd.ITEM_ID
) a
Where a.BID_TIME < ISNULL(a.END_BID_TIME, '2200-01-01')
)

,finalCTE as (
Select ITEM_ID, MAX_BID_NAME, MAX_BID_VALUE, BID_TIME From (
    Select
        ROW_NUMBER() over (partition by c.ITEM_ID order by c.BID_VALUE desc) as 'brnk'
        ,c.ITEM_ID
        ,c.BIDDER_NAME as 'MAX_BID_NAME'
        ,c.BID_VALUE as 'MAX_BID_VALUE'
        ,c.BID_TIME
    From cteValidBIDS c
    ) a
    Where a.brnk = 1
)

Select i.ITEM_ID, i.ITEM_NAME, i.START_VALUE, c.MAX_BID_NAME, c.MAX_BID_VALUE, c.BID_TIME
From #ITEMS i
LEFT JOIN finalCTE c on c.ITEM_ID = i.ITEM_ID