选择小于另一列中特定值的唯一值
Posted
技术标签:
【中文标题】选择小于另一列中特定值的唯一值【英文标题】:Selecting unique values that are smaller than specific values in another column 【发布时间】:2021-04-13 08:30:27 【问题描述】:使用普通查询,而不是脚本,我如何实现以下目标:
我有一个包含响应时间戳和请求时间戳的计算表。 除了这些时间戳之外,它们之间无法连接。
例如:
Response | response_timestamp | requests_timestamps
X 2021-03-07 07:34:59.000 2021-03-07 07:31:16.960
X 2021-03-07 07:34:59.000 2021-03-07 05:56:30.553
X 2021-03-07 07:34:59.000 2021-03-07 05:55:50.623
X 2021-03-07 07:34:59.000 2021-03-07 05:55:31.480
Y 2021-04-06 20:02:59.000 2021-04-05 20:01:49.960
Y 2021-04-06 20:02:59.000 2021-04-05 20:01:07.063
Y 2021-04-06 20:02:59.000 2021-04-05 20:00:16.600
Y 2021-04-06 20:02:59.000 2021-04-05 11:34:36.030
Z 2021-04-06 20:01:59.000 2021-04-05 20:01:49.960
Z 2021-04-06 20:01:59.000 2021-04-05 20:01:07.063
Z 2021-04-06 20:01:59.000 2021-04-05 20:00:16.600
Z 2021-04-06 20:01:59.000 2021-04-05 11:34:36.030
对于X,没有问题,我取小于等于响应时间的最大请求时间,意思是:X -> 2021-03-07 07:31:16.960
问题出现了,对于 Y 和 Z。注意它们都有相似的可能请求时间戳。
因此,在这种情况下,我需要将 Y 附加到 2021-04-05 20:01:49.960,将 Z 附加到 2021-04-05 20:01:07.063,因为 2021-04-05 20:01: 49.960 已经与 Y 匹配...
【问题讨论】:
“没有 T-SQL,只有 SQL”是什么意思?根据问题指南,请展示您尝试过的内容,并告诉我们您发现了什么(在本网站或其他地方)以及为什么它不能满足您的需求。 你怎么知道requests_timestamp
2021-04-05 20:01:49.960
是在Y
和Z
而不是X
之间共享的?
没有 RDBMS 支持“SQL”;他们都有自己的 SQL 方言,SQL Server 是 T-SQL。也许你的意思是 ANSI-SQL?如果是这样,请注意没有任何 RDBMS 支持所有的 ANSI 标准,并且它们已实现的内容也因 RDBMS 和 RDBMS 而异。仅仅因为它是 ANSI-SQL 并不意味着它可以在您使用的 RDBMS 或其特定版本上运行。
"没有 T-SQL,只有 SQL" = 使用普通查询,而不是脚本 你怎么知道 requests_timestamp 2021-04-05 20:01:49.960在 Y 和 Z 而不是 X 之间共享? 它也可能被 X 共享,但 X 有另一个最大请求时间,它比它小,但比所有其他的都大
【参考方案1】:
问题不是 100% 清楚,因为数据具有问题中根本没有描述的模式。如果我假设以下:
-
时间戳是唯一的,除非所有时间戳在两个响应之间都是重复的。
响应的排序基于
response
的字母顺序。
然后,我可以将问题解释为符合以下两个计数:
枚举每个响应中的时间戳。 查找每个响应的枚举最大值。这就是上面需要匹配的。这一切都可以通过窗口函数和过滤轻松处理:
select t.*
from (select t.*,
max(request_seqnum) over (partition by response) as response_request_seqnum
from (select t.*,
row_number() over (partition by requests_timestamps order by response) as request_seqnum,
row_number() over (partition by response order by requests_timestamps desc) as seqnum
from t
) t
) t
where seqnum = response_request_seqnum
order by 1, 2, 3;
Here 是一个 dbfiddle。
注意:如果上述假设不成立,那么我建议您提出一个新 问题,提供适当的示例数据和对需要实现的逻辑的非常清晰的解释。
【讨论】:
以上是关于选择小于另一列中特定值的唯一值的主要内容,如果未能解决你的问题,请参考以下文章
从表中选择行,其中具有相同 id 的另一个表中的行在另一列中具有特定值