Sql 选择小于另一列中特定值的唯一值
使用普通查询而不是脚本,如何实现以下目标: 我有一个包含响应时间戳和请求时间戳的计算表。 除了这些时间戳,它们之间没有连接的方式 例如:Sql 选择小于另一列中特定值的唯一值,sql,sql-server,window-functions,Sql,Sql Server,Window Functions,使用普通查询而不是脚本,如何实现以下目标: 我有一个包含响应时间戳和请求时间戳的计算表。 除了这些时间戳,它们之间没有连接的方式 例如: 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
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,问题出现了。请注意,它们都具有相似的可能请求时间戳
因此,在本例中,我需要用2021-04-05 20:01:49.960附加Y,用2021-04-05 20:01:07.063附加Z,因为2021-04-05 20:01:49.960已经与Y匹配。问题不是100%清楚,因为数据中的模式在问题中根本没有描述。如果我假设如下:
响应
的字母顺序- 枚举每个响应中的时间戳
- 查找每个响应的最大枚举数。这就是上面需要匹配的内容
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;
他是一把小提琴
注:如果上述假设不成立,那么我建议您提出一个新问题,提供适当的样本数据和需要实现的逻辑的非常清晰的解释。“没有T-SQL,只有SQL”这意味着什么?根据问题指南,请说明您尝试了什么,并告诉我们您(在本网站或其他地方)发现了什么以及为什么它不能满足您的需要。您如何知道
请求时间戳2021-04-05 20:01:49.960
在Y
和Z
之间共享,而不是X
?没有RDBMS支持“SQL”;它们都有自己的SQL方言,SQL Server的是T-SQL。也许你指的是ANSI-SQL?如果是这样的话,请注意没有任何RDBMS支持所有ANSI标准,它们所实现的内容也因RDBMS而异。仅仅因为它是ANSI-SQL,并不意味着它将在您正在使用的RDBMS或其特定版本上工作。“没有t-SQL,只有SQL”=使用普通查询,而不是脚本。您如何知道请求的时间戳2021-04-05 20:01:49.960在Y和Z之间共享,而不是在X之间共享?它也可以由X共享,但X有另一个最大请求时间,它比它小,比所有其他的都大