根据重复组值获取数据

Posted

技术标签:

【中文标题】根据重复组值获取数据【英文标题】:Get data based on repetitive group values 【发布时间】:2020-06-12 15:48:18 【问题描述】:

我不知道如何正确命名问题,但这里是示例数据:



CREATE TABLE dbo.test_data
(
    row_version     VARBINARY(8)
  , account_number  CHAR(8)
  , account_balance DECIMAL(10, 2)
  , group_rank      BIGINT
  , rownum          BIGINT
);

INSERT INTO dbo.test_data
VALUES (0x000000000013fd24, '46436663', 123.00, 4, 86)
     , (0x000000000013fd23, '46436663', 123.00, 4, 86)
     , (0x000000000013fd22, '46436663', 123.00, 4, 85)
     , (0x000000000013fd21, '46436663', 123.00, 4, 85)
     , (0x000000000013fd20, '46436663', 123.00, 4, 83)
     , (0x000000000013fd1f, '46436663', 555.00, 2, 83)
     , (0x000000000013fd21, '46436663', 123.00, 4, 85)
     , (0x000000000013fd20, '46436663', 123.00, 4, 83)
     , (0x000000000013fd21, '46436663', 123.00, 4, 85)
     , (0x000000000013fd20, '46436663', 123.00, 4, 83)
     , (0x000000000013fd1e, '46436664', 12345.00, 5, 82)
     , (0x000000000013fd1d, '46436664', 12345.00, 5, 82)
     , (0x000000000013fd1c, '46436664', 12345.00, 5, 82)
     , (0x000000000013fd1b, '46436664', 12345.00, 5, 81)
     , (0x000000000013fd1a, '46436664', 12345.00, 5, 81)
     , (0x000000000013fd19, '46436664', 12345.00, 5, 78)
     , (0x000000000013fcb3, '46436664', 123.00, 6, 77)
     , (0x000000000013fcb2, '46436664', 123.00, 6, 77)
     , (0x000000000013fcb1, '46436664', 123.00, 6, 76)
     , (0x000000000013fcb0, '46436664', 123.00, 6, 76);

这是数据的样子:

SELECT * FROM dbo.test_data
ORDER BY row_version DESC

这里的 1 和 4(蓝色)是连续的组号,它们的最小序列为 2 个相同的值,您可以通过 row_version 订购它们。我需要找到不同group_rank(2,红色)的第一次出现,然后检查rownum值(3,6,紫色)在哪里是MIN(row_num)上组(蓝色)和row_num的记录就在小组结束之前(红色)。如果这些值相差 1,那么我需要 account_number 然后我需要返回它,否则 - 我不需要返回它。

我对帐户低于 2 分和 5 分(红色)的情况不感兴趣。

因此,通过查看该数据,应返回唯一帐户 - 4643666446436663 rownum 值相同 (83)。

【问题讨论】:

那么,你在这里究竟得到了什么结果? 我不适合你。如果您在谈论预期结果,那么它是 46436664 所以您的预期结果是只是46436664?没有别的吗? 是的,只是单身 【参考方案1】:

有趣的问题我想第一步是找到问题 account_numbers,你可以这样做。

select 
    * 
from 
    dbo.test_data t1
cross apply (
    select top 1 
        * 
    from 
        dbo.test_data 
    where 
        account_number = t1.account_number
        and rownum = t1.rownum
        and row_version > t1.row_version 
    order by 
        row_version asc) t2
where 
    t1.group_rank <> t2.group_rank 
order by
    t1.row_version;

那么你可以这样做

select distinct 
    t0.account_number 
from 
    test_data t0

except

select distinct
    t1.account_number 
from 
    dbo.test_data t1
cross apply (
    select top 1 
        * 
    from 
        dbo.test_data 
    where 
        account_number = t1.account_number
        and rownum = t1.rownum
        and row_version > t1.row_version 
    order by 
        row_version asc) t2
where 
    t1.group_rank <> t2.group_rank 

【讨论】:

以上是关于根据重复组值获取数据的主要内容,如果未能解决你的问题,请参考以下文章

根据组值填写NA [重复]

如何根据来自firebase的时间戳获取排序数据[重复]

根据不同的周开始和结束日期获取数据[重复]

如何根据数据框中的列值获取特定的行数[重复]

如果列中的值在一组值列表中,则过滤数据框行[重复]

从表中获取逗号分隔的一组值,其中另一个表上的另一个参考值出现两次(或更多)