2013-03-22 2 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

Используя свой первый запрос, не включается, я думаю, вы могли бы просто поставить DateAdded в агрегатной функции, как 'MAX (Dat eAdded) ' –

ответ

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. Мне просто нужна датада, связанная с minprice – Damo

+0

change fi2.DateAdded to Cast (конвертировать (varchar (20), fi2.DateAdded, 101) в качестве даты и времени) –

+0

Проверить обновленный ответ. –

0

ОК, я решил упростить это немного, как я потратил слишком много времени на это уже, так что теперь я передаю определенную дату в запросить и выполнить запрос несколько раз, чтобы получить нужные мне результаты:

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)

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