何百ものレコードがあるテーブルdbo.X
があります。DateTime
column Y
私のストアドプロシージャにはパラメータがあります。上記の表で、より小さく、最も近い@CurrentDate
日付を調べたいです。column Y
dbo.X
@CurrentDate.
それを見つける方法は?
何百ものレコードがあるテーブルdbo.X
があります。DateTime
column Y
私のストアドプロシージャにはパラメータがあります。上記の表で、より小さく、最も近い@CurrentDate
日付を調べたいです。column Y
dbo.X
@CurrentDate.
それを見つける方法は?
where句は、日付が@CurrentDate未満のすべての行に一致し、降順であるため、TOP1が現在の日付に最も近い日付になります。
SELECT TOP 1 *
FROM x
WHERE x.date < @CurrentDate
ORDER BY x.date DESC
DateDiffを使用して、その日付と入力の間にある日数または秒数で結果を並べ替えます
このようなもの
select top 1 rowId, dateCol, datediff(second, @CurrentDate, dateCol) as SecondsBetweenDates
from myTable
where dateCol < @currentDate
order by datediff(second, @CurrentDate, dateCol)
私はこの問題に対してより良い解決策があると思います。
最終的な解決策をサポートおよび説明するために、いくつかの画像を示します。
背景 私のソリューションには、為替レートの表があります。これらは、さまざまな通貨の市場レートを表しています。ただし、サービスプロバイダーはレートフィードに問題があるため、一部のレートの値はゼロです。欠測データに、欠測レートに時間的に最も近い同じ通貨のレートを入力したいと思います。基本的に、最も近いゼロ以外のレートのRateIdを取得し、それを置き換えます。(これは私の例ではここには示されていません。)
1)まず、不足している料金情報を特定しましょう。
私の不足しているレートを示すクエリ、つまりレート値がゼロである
2)次に、欠落していないレートを特定します。 欠落していないレートを示すクエリ
3)このクエリは魔法が起こる場所です。ここでは、削除できると仮定しましたが、クエリの効率/パフォーマンスを向上させるために追加されました。26行目の仮定は、行方不明/ゼロのトランザクションと同じ日に代替トランザクションを見つけることを期待しています。魔法は23行目です。Row_Number関数は、欠落しているトランザクションと欠落していないトランザクションの間の最短の時間差のために、1から始まる自動番号を追加します。次に近いトランザクションの行数は2などです。
25行目では、通貨の種類が一致しないように、通貨を結合する必要があることに注意してください。つまり、AUD通貨をCHF値に置き換えたくないのです。最も近い通貨が欲しいです。
2つのデータセットをrow_numberと組み合わせて、最も近いトランザクションを識別します
4)最後に、RowNumが1であるデータを取得しましょう 。最後のクエリ
クエリの完全なクエリは次のとおりです。
; with cte_zero_rates as
(
Select *
from fxrates
where (spot_exp = 0 or spot_exp = 0)
),
cte_non_zero_rates as
(
Select *
from fxrates
where (spot_exp > 0 and spot_exp > 0)
)
,cte_Nearest_Transaction as
(
select z.FXRatesID as Zero_FXRatesID
,z.importDate as Zero_importDate
,z.currency as Zero_Currency
,nz.currency as NonZero_Currency
,nz.FXRatesID as NonZero_FXRatesID
,nz.spot_imp
,nz.importDate as NonZero_importDate
,DATEDIFF(ss, z.importDate, nz.importDate) as TimeDifferece
,ROW_NUMBER() Over(partition by z.FXRatesID order by abs(DATEDIFF(ss, z.importDate, nz.importDate)) asc) as RowNum
from cte_zero_rates z
left join cte_non_zero_rates nz on nz.currency = z.currency
and cast(nz.importDate as date) = cast(z.importDate as date)
--order by z.currency desc, z.importDate desc
)
select n.Zero_FXRatesID
,n.Zero_Currency
,n.Zero_importDate
,n.NonZero_importDate
,DATEDIFF(s, n.NonZero_importDate,n.Zero_importDate) as Delay_In_Seconds
,n.NonZero_Currency
,n.NonZero_FXRatesID
from cte_Nearest_Transaction n
where n.RowNum = 1
and n.NonZero_FXRatesID is not null
order by n.Zero_Currency, n.NonZero_importDate
CREATE PROCEDURE CurrentDate
@CurrentDate DATETIME
AS
BEGIN
Select * from orders
where OrderDate < @CurrentDate
END
GO