USE dev_db
GO
CREATE TABLE T1_VALS
(
[SITE_ID] [int] NULL,
[LATITUDE] [numeric](10, 6) NULL,
[UNIQUE_ID] [int] NULL,
[COLLECT_RANK] [int] NULL,
[CREATED_RANK] [int] NULL,
[UNIQUE_ID_RANK] [int] NULL,
[UPDATE_FLAG] [int] NULL
)
GO
INSERT INTO T1_VALS
(SITE_ID,LATITUDE,UNIQUE_ID,COLLECT_RANK,CREATED_RANK,UNIQUEID_RANK)
VALUES
(207442,40.900470,59664,1,1,1)
(207442,40.900280,61320,1,1,2)
(204314,40.245220,48685,1,2,2)
(204314,40.245910,59977,1,1,1)
(202416,39.449530,9295,1,1,2)
(202416,39.449680,62264,1,1,1)
我从两个日期列(此处未显示)生成了COLLECT_RANK
和CREATED_RANK
列,并从此处使用的UNIQUE_ID
生成了UNIQUEID_RANK
列。
我使用了一个带有排名函数的SELECT OVER
子句来生成这些列。_RANK
值 1 表示最新日期或最大UNIQUE_ID
值。我认为通过数组和光标处理使用这些排名值的解决方案会非常简单,但我似乎把自己画进了一个角落。
我的问题:我需要根据以下业务规则选择LONGITUDE
值及其UNIQUE_ID
,并在UPDATE_FLAG
列中为该记录设置更新值 (1)。
选择给定SITE_ID具有最新收集日期(即 RANK 值 = 1)的记录。如果存在具有相同收集日期(即相同的 RANK 值)的多个记录,请选择给定SITE_ID具有最近创建日期(RANK 值 =1)的记录。如果存在具有相同创建日期的多个记录,请选择给定SITE_ID具有最高唯一 ID 的记录(即 RANK 值 = 1)。
您的建议将不胜感激。
我认为您可以使用top
和order by
:
select top 1 t1.*
from t1_vals
order by collect_rank asc, create_rank, unique_id desc;
如果您希望对网站执行此操作,这可能是您的问题所要问的,请使用row_number()
:
select t1.*
from (select t1.*,
row_number() over (partition by site_id order by collect_rank asc, create_rank, unique_id desc) as seqnum
from t1_vals
) t1
where seqnum = 1;