2013-03-22 112 views
4

我正在使用SQL 2008,但無法使此查詢正常工作。我有一個表格,裏面有航班價格細節。每條路線每天都有很多行,我想返回路線的每日最低價格以及DateAdded(行添加的日期時間)。我幾乎在那裏,因爲我似乎已經設法返回每天返回的最低價格,但我似乎無法得到正確的日期加入返回。下面的代碼似乎能夠返回每天的最低價格,但我認爲我需要某種連接來返回DateAdded?SQL GROUP BY或JOIN

ALTER PROCEDURE [dbo].[FlightInfoLowestPricePerDay] 
(
@AirportFrom varchar(5), 
@AirportTo  varchar(5) 
) 

AS 
select DATEADD(dd, 0, DATEDIFF(dd, 0, TimeDeparture)) as FlightDate, MIN(Price) as MinPrice 


from FlightInfo 
where AirportFrom = @AirportFrom and AirportTo = @AirportTo 
AND TimeDeparture > DATEADD(dd, 0, DATEDIFF(dd, 0, GETDATE())) 

Group By DATEADD(dd, 0, DATEDIFF(dd, 0, TimeDeparture)) 
Order by FlightDate ASC 

我已經試過的東西,如下面的代碼,但我不完全瞭解聯接卻又如此一直在掙扎了好一陣子,雖然我敢肯定,我失去了一些東西很簡單!

ALTER PROCEDURE [dbo].[FlightInfoLowestPricePerDay] 
(
@AirportFrom varchar(5), 
@AirportTo  varchar(5) 
) 

AS 
select DATEADD(dd, 0, DATEDIFF(dd, 0, fi1.TimeDeparture)) as FlightDate, MIN(fi1.Price)  as  MinPrice, fi2.DateAdded 


from FlightInfo 
fi1 join FlightInfo fi2 on fi1.Price = fi2.Price 
where fi1.AirportFrom = @AirportFrom and fi1.AirportTo = @AirportTo 
AND fi1.TimeDeparture > DATEADD(dd, 0, DATEDIFF(dd, 0, GETDATE())) 

Group By DATEADD(dd, 0, DATEDIFF(dd, 0, fi1.TimeDeparture)) 
Order by FlightDate ASC 
+0

(DAT eAdded)' – 2013-03-22 10:44:00

回答

0

在組中添加fi2.DateAdded通過

ALTER PROCEDURE [dbo].[FlightInfoLowestPricePerDay] 
(
@AirportFrom varchar(5), 
@AirportTo  varchar(5) 
) 

AS 
select DATEADD(dd, 0, DATEDIFF(dd, 0, fi1.TimeDeparture)) as FlightDate, MIN(fi1.Price)  as  MinPrice, Cast(Convert(varchar(20),fi2.DateAdded,101) as datetime) DateAdded 


from FlightInfo 
fi1 join FlightInfo fi2 on fi1.Price = fi2.Price 
where fi1.AirportFrom = @AirportFrom and fi1.AirportTo = @AirportTo 
AND fi1.TimeDeparture > DATEADD(dd, 0, DATEDIFF(dd, 0, GETDATE())) 

Group By DATEADD(dd, 0, DATEDIFF(dd, 0, fi1.TimeDeparture)),Cast(Convert(varchar(20),fi2.DateAdded,101) as datetime) 
Order by FlightDate ASC 
+0

這不起作用,它現在每天帶回多行而不是隻有最低價格行。我只需要與minprice關聯的dateadded – Damo 2013-03-22 10:52:15

+0

更改fi2.DateAdded以Cast(轉換(varchar(20),fi2.DateAdded,101)作爲日期時間) – 2013-03-22 10:57:01

+0

檢查更新的答案。 – 2013-03-22 10:57:30

0

OK,我決定把它簡化一點,因爲我已經浪費了太多的時間在這已經所以現在我傳遞的具體日期到查詢並運行查詢多次以獲得我需要的結果:

ALTER PROCEDURE [dbo].[FlightInfoLowestPriceDateAddedForSpecificDate] 
(
@AirportFrom varchar(5), 
@AirportTo  varchar(5), 
@Date   datetime 
) 

AS 

select top 1 * 
from FlightInfo 

where AirportFrom = @AirportFrom and AirportTo = @AirportTo 
AND DATEADD(dd, 0, DATEDIFF(dd, 0, TimeDeparture)) = DATEADD(dd, 0, DATEDIFF(dd, 0, @Date)) 

Order by Price asc 
0

您想爲此使用窗口函數。一種方法是用row_number()

select flightDate, price 
from (select DATEADD(dd, 0, DATEDIFF(dd, 0, TimeDeparture)) as FlightDate, fi.*, 
      ROW_NUMBER() over (partition by airportFrom, airportTo, DATEADD(dd, 0, DATEDIFF(dd, 0, TimeDeparture)) order by price) as seqnum 
     from FlightInfo fi 
     where AirportFrom = @AirportFrom and AirportTo = @AirportTo and 
      TimeDeparture > DATEADD(dd, 0, DATEDIFF(dd, 0, GETDATE())) 
    ) fi 
where seqnum = 1 

如果您在使用SQL Server的較新版本,那麼你可以採取的date數據類型的優勢:

select flightDate, price 
from (select cast(TimeDeparture as date) as FlightDate, fi.*, 
      ROW_NUMBER() over (partition by airportFrom, airportTo, cast(TimeDeparture as date) order by price) as seqnum 
     from FlightInfo fi 
     where AirportFrom = @AirportFrom and AirportTo = @AirportTo and 
      TimeDeparture > cast(getdate() as date) 
    ) fi 
where seqnum = 1 
0

您可以將兩個子查詢(一說得到每天的小的價格和使用你的第一個查詢,而無需連接我認爲你可以只是把DateAdded到像`MAX聚合函數的第二個的設置DateAdded)

SELECT f1.FlightDate, f1.MinPrice, f2.DateAdded From 
( 
    SELECT 
     DATEADD(dd, 0, DATEDIFF(dd, 0, fi1.TimeDeparture)) as FlightDate, 
     MIN(fi1.Price) as MinPrice 
    FROM FlightInfo fi1 
    WHERE fi1.AirportFrom = @AirportFrom and fi1.AirportTo = @AirportTo 
     AND fi1.TimeDeparture > DATEADD(dd, 0, DATEDIFF(dd, 0, GETDATE())) 
    Group By 
     DATEADD(dd, 0, DATEDIFF(dd, 0, fi1.TimeDeparture)) 
) f1 
INNER JOIN 
(
    SELECT DISTINCT 
     DATEADD(dd, 0, DATEDIFF(dd, 0, fi2.DateAdded)) AS DateAdded, 
     Price FROM FlightInfo fi2 
    WHERE fi2.AirportFrom = @AirportFrom and fi2.AirportTo = @AirportTo 
     AND fi2.TimeDeparture > DATEADD(dd, 0, DATEDIFF(dd, 0, GETDATE())) 
) f2 ON f2.Price = f1.MinPrice