我最近学会了如何使用聚合查询使用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
函数。
希望这一切都有意义。
感谢。
答案 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>
。但是你正在寻找多种状态,所以你也可以为所有这些使用相同的功能。