我正在尝试编写一个SQL查询,以获取特定工具的月底价格。
表(包含一些可以忽略的其他列):
| instrumentId| unitPrice|联系我们|
| --|--|--|
| 1 |九十点二二|2018-10-28 2018-10-28|
| 1 |八十点五五|2018-10-30 2018-10-30|
| 1 |70.55| 2018-09-15 2018-09-15 2018-09-15|
| 1 |七十点五六|2018-09-23 2018-09-23|
预期结果:
| instrumentId| unitPrice|联系我们|
| --|--|--|
| 1 |八十点五五|2018-10-30 2018-10-30|
| 1 |七十点五六|2018-09-23 2018-09-23|
对于同一个instrumentId
,将有多个行,其中不同月份的reportedAt
不同。这个想法是针对每个月和每年(例如,2018年10月),我试图只得到每个月的最后价格reportedAt
。
SELECT
"instrumentId",
"unitPrice",
MAX("reportedAt") as reportedAt
FROM
"InstrumentPrice"
WHERE
"instrumentId" = 90
GROUP BY
EXTRACT(MONTH FROM "reportedAt"),
EXTRACT(YEAR FROM "reportedAt")
ORDER BY
"reportedAt" DESC
但是,这个查询不断抛出一个错误,指出选定的列必须出现在GROUP BY
子句中或在聚合函数中使用。
这将不起作用,因为如果我按unitPrice
或reportedAt
分组,我将不会得到所需的结果(因为它们都是唯一的)。
2条答案
按热度按时间8zzbczxx1#
查询中的错误是由于将列
unitPrice
和instrumentId
包含在SELECT
子句中,而没有将其包含在聚合函数或GROUP BY
子句中。在SQL中,当你使用
GROUP BY
时,你应该:您可以使用窗口函数来实现这一点。您可以使用
ROW_NUMBER()
窗口函数,根据reportedAt
列为每个月和年分区中的每一行分配一个行号,然后筛选行号为1(表示每个月报告的最后价格)的行。你可以这样做:在此查询中:
1.内部子查询使用
ROW_NUMBER()
窗口函数为每个月和年分区中的每一行分配一个行号。PARTITION BY
子句按instrumentId
、月和年对数据进行分区,并按reportedAt
降序排列每个分区中的行。1.然后,外部查询选择行号为1的行,这对应于每个月和年组合报告的最后一个价格。
dauxcl2d2#
group by
不适合您的工作。这里使用窗口函数row_number()
。Demo