-2

主キー (ID も) として ID と datetimestamp 列を持つテーブルがあります。以下に示すように、タイムスタンプ値ごとにソートされた ID でテーブルを更新する必要があります。すべての ID が存在するわけではありません。ID は正しく、日時スタンプがごちゃごちゃしていて、並べ替える必要があります。

現在のデータを含むデータベーステーブル -

id  datetimestamp
--  -----------------------
1   2013-08-08 14:08:43.560
2   2013-08-05 14:08:46.963
4   2013-08-06 14:08:53.247
5   2013-08-04 14:08:55.610
6   2013-08-03 14:08:58.543
8   2013-08-05 14:08:46.963
9   2013-08-06 14:08:53.247
10  2013-08-04 14:08:55.610
11  2013-08-03 14:08:58.543

として必要なデータ -

id  datetimestamp
--  -----------------------
1   2013-08-03 14:08:58.543
2   2013-08-03 14:08:58.543
4   2013-08-04 14:08:55.610
5   2013-08-04 14:08:55.610
6   2013-08-05 14:08:46.963
8   2013-08-05 14:08:46.963
9   2013-08-06 14:08:53.247
10  2013-08-06 14:08:53.247
11  2013-08-08 14:08:43.560

以下は、サンプルデータを作成できるスクリプトです -

create table #tmp_play
(id int identity (1,1) primary key, datetimestamp datetime)

insert into #tmp_play values (getdate());
insert into #tmp_play values (getdate()-3);
insert into #tmp_play values (getdate()-1);
insert into #tmp_play values (getdate()-2);
insert into #tmp_play values (getdate()-4);
insert into #tmp_play values (getdate()-5);

delete from #tmp_play where id = 3

insert into #tmp_play (datetimestamp) 
select datetimestamp from #tmp_play

delete from #tmp_play where id = 7

以下のアプローチで試してみましたが、ID がないため使用できません。

with sorted as 
(select top 100 ROW_NUMBER() OVER(ORDER BY datetimestamp) as RowNum, * 
 from #tmp_play order by datetimestamp)
update t
set t.datetimestamp = s.datetimestamp
from #tmp_play t
join sorted s on t.id = s.RowNum

このデータをどのようにソートできるか考えていますか?

4

2 に答える 2

4

なぜ順番が重要なのですか?id 1 が id 2 よりも小さい/大きい時間値を持っていることは、アプリケーションやビジネスにとって問題ではありません。悪いデータと見なされるものを修正しようとしていることは理解していますが、これは実際にはアプリケーションに影響を与えるべきではありません。また、このシーケンス番号はあまり価値がないため、おそらくより適切に導出されることに同意します。

そうは言っても、当面の問題を解決するには、2 組のシーケンス番号を取得する必要があります。1 は datetimestamp 用で、もう 1 つは ID 用です。その後、これら 2 つを結合して行を更新できます。

;with Id_Order
AS
(
select *, id_seq = ROW_NUMBER() over(order by id)
from #tmp_play
),
Dt_Order
as
(
select *, dt_seq = ROW_NUMBER() over(order by datetimestamp asc)
from #tmp_play
)
update a
set datetimestamp = dt.datetimestamp
from Id_Order a
inner join Dt_Order dt
    on a.id_seq = dt.dt_seq
于 2013-08-08T13:58:03.033 に答える