3

を含む一連のデータがありますDateTime。たとえば、現在の日付から開始して、現在の日付より前のレコードの量を取得し、その後から同じ量をCalculatedOn取得したいとします。getdate()x

その場合x = 50、今より前に 50、今より前に 50 です。私はrownumber()これに最適だと思っていましたが、前に負の行、将来に正の行に番号を付ける方法がわかりません。

また、50 の前または未来がない場合に何が起こるかという問題もありますが、それは後で発生します。

テーブルに列が 2 つだけあるとします。

create table MyTable
(
   Id int not null constraint pk_mytable primary key,
   SomeTextIWant nvarchar(50) not null,
   CalculateDate DateTime not null
);

結果 :

今日が 25/04 12:54 の場合

それから

Id, SomeTextIWant, CalculatedDate
-- 50 from before now--
-----now here-----
-- 50 from after now--
4

4 に答える 4

3

前後に 50 行を取得したい場合は、おそらく次のようになります。

with cte1 as (
      select top 50 t.*
      from table t
      where CalculatedDate <= getdate()
      order by CalculatedDate desc
     ),
     cte2 as (
      select top 50 t.*
      from table t
      where CalculatedDate > getdate()
      order by CalculatedDate
     )
select *
from (select * from cte1 union all select * from cte2) t

編集:

行番号が実際に必要かどうかは、質問の文脈からはわかりません。追加するのは簡単ですが、次のとおりです。

(select top 50 t.*,
        - row_number() over (order by CalculatedDate desc) as rownumber
 from table t
 where CalculatedDate <= getdate()
 order by CalculatedDate desc
)
union all
(select top 50 t.*,
        row_number() over (order by CalculatedDate) as rownumber
 from table t
 where CalculatedDate > getdate()
 order by CalculatedDate
)

これらを実際に 1 つのクエリに組み合わせることができます。

select t.*,
       ((case when CalculatedDate < getdate() then -1 else 1 end) *
        (row_number() over (partition by (case when CalculatedDate < getdate() then 1 else 0 end)
                           order by (case when CalculatedDate < getdate() then CalculatedDate end) desc, 
                                     CalculatedDate asc
                           )
         )) as rn
from table t;

これをサブクエリに入れて、rn-50 から 50 の間で選択できます。

ただし、行番号 0 についてどうすればよいかわかりません。この質問には、一致するレコードをどうするかについての情報がありませんgetdate()(ありそうもないことですが)。最初の答えは、OPが必要とするものだと思います。

于 2014-04-25T11:52:03.773 に答える
1

2 つの CTEを使用できます。1 つは過去の日付用で、もう 1 つは未来の日付ROW_NUMBERASCです 。DESC-1

WITH dataBefore AS
(
    SELECT d.*, rn = (-1) * row_Number() over (Order By CalculatedOn DESC)
    FROM dbo.TableName d
    WHERE CalculatedOn < GetDate()
)
, dataAfter AS
(
    SELECT d.*, rn = row_Number() over (Order By CalculatedOn ASC)
    FROM dbo.TableName d
    WHERE CalculatedOn >= GetDate()
)
SELECT * FROM
(
    SELECT db.*
    FROM dataBefore db
    UNION ALL 
    SELECT da.*
    FROM dataAfter da
)x
WHERE x.rn >= -50 AND x.RN <= 50
ORDER BY x.RN
于 2014-04-25T11:56:55.017 に答える
0

これを試して...

With myCte
As
(
    Select top 2 column1,column2 from  YourTable where yourdate > '2014-04-23'
    union 
    Select top 2 column1,column2 from  YourTable where yourdate  < '2014-04-23'
) select ROW_NUMBER() over (order by column1) as RNO,* from myCte
于 2014-04-25T11:58:14.667 に答える
0

行番号あり

SELECT TOP 50 ROW_NUMBER() OVER (ORDER BY CalculateDate) AS RowNum,
    id, SomeTextIWant, CalculateDate
FROM MyTable
WHERE CalculateDate > @Date

UNION ALL

SELECT TOP 50 -ROW_NUMBER() OVER (ORDER BY CalculateDate DESC) AS RowNum,
    id, SomeTextIWant, CalculateDate
FROM MyTable
WHERE CalculateDate < @Date
于 2014-04-25T12:10:22.273 に答える