SQL Server 2016 比较单个表中多行中多列的值


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_RANKCREATED_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)。

您的建议将不胜感激。

我认为您可以使用toporder 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;

相关内容

  • 没有找到相关文章

最新更新