【问题标题】:SQL Server 2016 Compare values from multiple columns in multiple rows in single tableSQL Server 2016 比较单个表中多行中多列的值
【发布时间】:2018-04-07 18:40:52
【问题描述】:
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)。

您的建议将不胜感激。

【问题讨论】:

    标签: sql-server compare multiple-columns rows


    【解决方案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;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-04-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-27
      • 2021-04-13
      • 1970-01-01
      相关资源
      最近更新 更多