如何根据另一列值

时间:2018-04-19 10:52:59

标签: sql google-bigquery

我最近学会了如何使用聚合查询使用ARRAY_AGG函数返回最大值(通过聚合,我的意思是在查询中的某个点处有group by函数)。我最近尝试将ARRAY_AGG函数与非聚合查询一起应用,以返回最大值,并且它没有像我期望的那样工作。所以我的问题是:如何根据另一个列输入获得列的最大值。

为了在我的问题中添加更多上下文,情况就是这样。假设您有一位用户正在更新其状态。我想要一个查询,我可以拥有最近的状态,但同时也是他最近的第二个(或者是他最近更新之前的那个)。

所以这是表格:

    accountKey  paymentType   date          Status   
    51135473    transaction   2016-10-16    Mini         
    51135473    UpdateStatus  2016-09-22    Mini         
    51135473    transaction   2016-12-08    Standard         
    51135473    transaction   2016-11-08    Standard         
    51135473    UpdateStatus  2016-11-08    Standard

这是我想要的结果:

accountKey  paymentType   date       Status   CurrentStatus  PreviousStatus 
51135473    transaction   2016-10-16 Mini     Standard       Mini
51135473    UpdateStatus  2016-09-22 Mini     Standard       Mini
51135473    transaction   2016-12-08 Standard Standard       Mini
51135473    transaction   2016-11-08 Standard Standard       Mini
51135473    UpdateStatus  2016-11-08 Standard Standard       Mini

上次状态只是集合中的最后一个状态。以前的状态是当前状态。全局的想法是为每个UpdateStatus paymentType同时具有当前状态和前一个状态。

就像我说的那样,我试图使用以下查询:

SELECT
  accountKey,
  paymentType,
  date,
  status,
  ARRAY_AGG(status ORDER BY date DESC LIMIT 1)[OFFSET (0)] CurrentStatus
FROM
  Table
GROUP BY 
  accountKey,
  paymentType,
  receivedOn

然而,这个查询在这里没什么意义,因为我不需要分组任何东西。我在这里分组,因为否则我可以运行查询。我了解我必须添加Group by功能,因为我使用的是ARRAY_AGG。那么我的问题是,如何在非分组查询中替换我在此处使用的ARRAY_AGG函数。

希望这一切都有意义。

感谢。

1 个答案:

答案 0 :(得分:2)

您可以使用select t.*, nth_value(status, 1) over (partition by accountkey order by date desc) as current_status, nth_value(status, 2) over (partition by accountkey order by date desc) as current_status_but_one from t;

first_value()

如果您只想要当前状态,我建议<script> var x = document.getElementById("demo"); function getLocation() { if (navigator.geolocation) { navigator.geolocation.getCurrentPosition(showPosition); } else { x.innerHTML = "Geolocation is not supported by this browser."; } } function showPosition(position) { x.innerHTML = "Latitude: " + position.coords.latitude + "<br>Longitude: " + position.coords.longitude; } </script> 。但是你正在寻找多种状态,所以你也可以为所有这些使用相同的功能。