选择小于另一列中特定值的唯一值

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 是在YZ 而不是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 的另一个表中的行在另一列中具有特定值

如何计算另一列中特定值的列的平均值?

选择一列中重复编号的记录,另一列中选择唯一字符串

删除同一列或连续行的另一列中具有特定值和缺失值的行

在 SQL 中,我可以在另一列中获取与它们没有关联的特定值的列中的值吗?

如果另一列中的相应行包含特定值,我想使用条件格式突出显示一列中的单元格