PostgreSQL查询以ASC顺序返回10个最大的数字

vojdkbi0  于 2023-01-17  发布在  PostgreSQL
关注(0)|答案(4)|浏览(293)

我在查询中发现一个问题:

SELECT * FROM stocks_historic
WHERE ticker = x
ORDER BY YEAR ASC
LIMIT 10

当前表格如下:

stocks_historic (
    historic_id SMALLSERIAL UNIQUE,
    ticker VARCHAR(10) NOT NULL,
    year VARCHAR(5) NOT NULL,
    eps NUMERIC(6,2) NOT NULL,
    operatingCashFlow NUMERIC(12,4) NOT NULL,
    shares NUMERIC(12,4) NOT NULL,
    cash NUMERIC(12,4) NOT NULL,
    currentLiabilities NUMERIC(12,4) NOT NULL,
    currentAssets NUMERIC(12,4) NOT NULL,
    incomeBeforeTax NUMERIC(12,4) NOT NULL,
    incomeTaxExpense NUMERIC(12,4) NOT NULL,
    totalDebt NUMERIC(12,4) NOT NULL,
    revenue NUMERIC(12,4) NOT NULL,
    costOfGoodSold NUMERIC(12,4) NOT NULL,
    operatingIncome NUMERIC(12,4) NOT NULL,
    equity NUMERIC(12,4) NOT NULL,
    capitalExpenditures NUMERIC(12,4) NOT NULL,
    fcf NUMERIC(12,4) NOT NULL,
    PRIMARY KEY (ticker, year)
);

预期结果:
如果我有15行相同的股票代码,年份从2010年到2025年,我希望得到过去10年的ASC顺序:

historic_id: 1,
year: 2015,
historic_id: 2,
year: 2016,
historic_id: 3,
year: 2017,
...

结果是,我得到了前10个数字,但由于我想要的最高10,是行不通的.
我知道我可以将ASC改为DESC,但是这会以不希望的顺序返回年数,前端预期年数为ASC顺序,所以我必须更改所有内容以适应它。
有没有办法让这10行按ASC排序?
谢谢鲁本。

58wvjzkj

58wvjzkj1#

要返回过去10年的数据,您需要ORDER BY ... DESC。如果您希望结果按升序排列,则必须重新排序,例如:

SELECT * 
FROM (SELECT * 
      FROM stocks_historic
      WHERE ticker = x
      ORDER BY YEAR DESC
      LIMIT 10) z
ORDER BY YEAR ASC

虽然可以使用其他排名函数来标识最后10行,例如ROW_NUMBER() OVER(ORDER BY YEAR DESC),但生成的执行计划仍必须对数据进行两次排序-一次用于获取ROW_NUMBER,另一次用于对结果进行重新排序。

vecaoik1

vecaoik12#

如果按年升序排序

ORDER BY year ASC

然后再看前十排,你当然会得到前十年。
如果按年降序排列

ORDER BY year DESC

你会得到最后几年的。
如果要以升序显示最近十年,请先获取结果,然后再排序:

SELECT *
FROM
(
  SELECT *
  FROM stocks_historic
  WHERE ticker = x
  ORDER BY year DESC
  FETCH FIRST 10 ROWS
) last_ten_years
ORDER BY year ASC;
f2uvfpb9

f2uvfpb93#

SELECT * FROM stocks_historic
    WHERE ticker = x
    ORDER BY YEAR ASC
    fetch first 10 rows only
tv6aics1

tv6aics14#

您可以执行子查询来获取数据,并执行外部查询来对其进行排序:

select *
from
    (SELECT * 
    FROM stocks_historic
    WHERE ticker = x
    ORDER BY YEAR desc
    LIMIT 10) temp
order by year asc

相关问题