根据重复组值获取数据
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 分(红色)的情况不感兴趣。
因此,通过查看该数据,应返回唯一帐户 - 46436664
与 46436663
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
【讨论】:
以上是关于根据重复组值获取数据的主要内容,如果未能解决你的问题,请参考以下文章