Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/79.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 选择小于另一列中特定值的唯一值_Sql_Sql Server_Window Functions - Fatal编程技术网

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有另一个最大请求时间,它比它小,比所有其他的都大