在sql中查找增加的子序列n次

时间:2017-05-19 04:02:29

标签: sql postgresql sequence

接下来是我之前关于在数据集中查找不断增加的子序列的问题。

Finding out the increasing subsequence in sql

获得结果

  x  |  y  
-----+-----
  94 | 985
 469 | 865
 525 | 842
 610 | 587
 765 | 579

来自

  x  |  y  
-----+-----
  94 | 985
  73 | 940
 469 | 865
 115 | 864
 366 | 862
 525 | 842
 448 | 837
 318 | 832
 507 | 826
 244 | 758
 217 | 741
 207 | 732
  54 | 688
 426 | 605
 108 | 604
 610 | 587
 142 | 581
 765 | 579
 102 | 572

我可以应用查询

select x, y
from (select max(x) over (order by y desc) as x_max, x, max(y) over (order by x desc) as y_max, y
    from table
    order by y desc, x desc) t
where t.x = t.x_max and t.y = t.y_max
order by y desc, x

现在我的问题是,如何执行此操作n次,即找到x的第2,第3,......,第n个增加的子序列。 我知道一般的想法是从原始表中获取第一个操作的结果,并对剩余的点执行查询。

所以在我的例子中,在第一次操作之后,我们有剩余的点,

  x  |  y  
-----+-----
  73 | 940
 115 | 864
 366 | 862
 448 | 837
 318 | 832
 507 | 826
 244 | 758
 217 | 741
 207 | 732
  54 | 688
 426 | 605
 108 | 604
 142 | 581
 102 | 572

再次应用查询,我们得到

  x  |  y  
-----+-----
  73 | 940
 115 | 864
 366 | 862
 448 | 837
 507 | 826

并在

上执行操作
  x  |  y  
-----+-----
 318 | 832
 244 | 758
 217 | 741
 207 | 732
  54 | 688
 426 | 605
 108 | 604
 142 | 581
 102 | 572
等等等等。我还想结合这些查询搜索的所有要点,并按y desc命令它们,即

  x  |  y  
-----+-----
  73 | 940
  94 | 985
 115 | 864
 366 | 862
 448 | 837
 469 | 865
 507 | 826
 525 | 842
 610 | 587
 765 | 579

1 个答案:

答案 0 :(得分:0)

这不是一件轻而易举的事。远非最优,但你确实可以用递归CTE做到这一点:

RequestBody requestFile = RequestBody.create(MediaType.parse("image*/"), file);

String descriptionString = "en-US";

RequestBody description = RequestBody.create(MediaType.parse("multipart/form-data"), descriptionString);

apiInterface.uploadPhoto("CloudSight key",description, requestFile);


In retrofit api call:

@Multipart
    @POST("https://api.cloudsightapi.com/image_requests")
    Call<FileUploadResponse> uploadPhoto(
            @Header("Authorization") String authorisation,
            @Part("image_request[locale]") RequestBody description,
            @Part("image_request[image]\"; filename=\"file.jpg\" " ) RequestBody file);

http://rextester.com/JDYJ58330