4

SQL 2008 を使用していますが、このクエリを機能させることができません。フライト料金の詳細が記載されたテーブルがあります。各ルートには毎日多くの行があり、ルートの 1 日あたりの最低価格と DateAdded (行が追加された日時) を返したいと考えています。1日あたりの最低価格を返すことができたように見えるので、ほとんどそこにいますが、正しい追加日を返すことができないようです. 以下のコードは 1 日あたりの最低価格を返すように見えますが、DateAdded も返すには何らかの結合が必要だと思いますか?

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
4

4 に答える 4

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
于 2013-03-22T11:53:04.717 に答える
0

Group By に 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
于 2013-03-22T10:44:01.917 に答える
0

これにはウィンドウ関数を使用します。1つの方法は次の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
于 2013-03-22T14:31:49.097 に答える