【发布时间】:2018-12-05 07:11:38
【问题描述】:
我目前正在尝试实现一些代码,它将获取给定 160 行行列表的日期,并将它们更新为同一个表中另一个日期后一分钟。
所以例如从这些将来自:
> 1058841 2018-06-20 14:15:04.000 Copy of NtO produced
> 1058841 2018-06-14 19:58:03.000 NTO service date set to 24/05/2018
> 969565 2018-06-20 14:15:01.000 17530 Copy of NtO produced
> 969565 2018-06-14 19:58:03.000 148 NTO service date set to 24/05/2018
到这里:
> 1058841 2018-06-14 19:59:03.000 Copy of NtO produced
> 1058841 2018-06-14 19:58:03.000 NTO service date set to 24/05/2018
> 969565 2018-06-14 19:59:03.000 17530 Copy of NtO produced
> 969565 2018-06-14 19:58:03.000 148 NTO service date set to 24/05/2018
我目前的代码如下:
declare @thisdate table
(
thisdate datetime,
thisref nvarchar(50)
)
declare @thisdate2 table
(
thisdate2 datetime
)
insert into @thisdate(thisdate) (select te_date from (
select row_number() over (partition by te_system_ref order by (select 0)) as rownumber, te_date from ticket_events where te_system_ref in
(select sl_system_ref from statutory_letter where sl_letter_batch = 9429)and te_event = 'Copy of NtO produced' and te_system_ref = 969565
) t where rownumber = 1)
;
insert into @thisdate(thisref) select te_system_ref from (
select row_number() over (partition by te_system_ref order by (select 0)) as rownumber, te_system_ref from ticket_events where te_system_ref in
(select sl_system_ref from statutory_letter where sl_letter_batch = 9429)and te_event = 'Copy of NtO produced' and te_system_ref = 969565
) t where rownumber = 1
;
insert into @thisdate2(thisdate2) select te_date from (
select row_number() over (partition by te_system_ref order by (select 0)) as rownumber, te_date from ticket_events where te_system_ref in
(select sl_system_ref from statutory_letter where sl_letter_batch = 9429)and te_event like 'NTO service date set to%' and te_system_ref = 969565
) t where rownumber = 1
;
update ticket_events
set te_date = dateadd(minute,1,(select thisdate2 from @thisdate2))
where te_date in (select thisdate from @thisdate) and te_system_ref in (select thisref from @thisdate) and te_event = 'Copy of NtO produced'
但是,这样做的问题是,如果用于填充变量的选择查询产生了多个结果,则它不再起作用。我将如何解决这个问题?
还有一个小问题,如何使用行号取最后一行而不是第一行?
任何帮助都将不胜感激!
【问题讨论】:
-
回答你的“奖金问题”;如果您的
ROW_NUMBER()语句中有一个确定性的ORDER BY子句,那么您可以通过简单地添加DESC将其从第一行交换到最后一行。现在最后一行被编号为 #1 而不是第一行。 -
感谢您的回复!但我很抱歉,我不太确定你所说的确定性 order by 子句是什么意思。我将如何实施?
-
如果您按日期之类的东西订购,那么它将具有已定义(确定性)的顺序,但按
SELECT 0订购并不适用“真实”顺序。 -
谢谢!我现在开始工作了
标签: sql tsql variables sql-update row-number