gpt4 book ai didi

MySQL:选择上面的行

转载 作者:行者123 更新时间:2023-11-28 23:30:05 25 4
gpt4 key购买 nike

是否可以编写一个 MySQL 查询,从符合特定条件的项目中选择上一行的所有项目?

例如,要获取“估值”大于 5 的价格:

SELECT  Price  FROM  table  WHERE   Valuation > 5

但是在估值升至 5 之上后的第二天,您将如何获得价格?

Date        Price   Valuation
01/06/2016 9.2 9
31/05/2016 9.3 5
27/05/2016 9.5 8
26/05/2016 9.7 7
25/05/2016 9.5 8
24/05/2016 9.3 4
23/05/2016 9.2 3
20/05/2016 9.2 5
19/05/2016 8.9 9
18/05/2016 9.1 4
17/05/2016 9.2 9

在此示例中,它将是 9.3、9.5、9.7、9.2 和 9.1

编辑:如果有帮助,可以将索引列添加到表中。

编辑:“一天后”是指表格中的下一行(而不是按时间顺序排列的第二天)

最佳答案

假设我们有

CREATE TABLE quotes( 
`date` date not null primary key,
price numeric(5,1) not null,
valuation integer not null
);


INSERT INTO quotes VALUES
('2016-06-01', 9.2, 9),
('2016-05-31', 9.3, 5),
('2016-05-27', 9.5, 8),
('2016-05-26', 9.7, 7),
('2016-05-25', 9.5, 8),
('2016-05-24', 9.3, 4),
('2016-05-23', 9.2, 3),
('2016-05-20', 9.2, 5),
('2016-05-19', 8.9, 9),
('2016-05-18', 9.1, 4),
('2016-05-17', 9.2, 9);

然后下面的 SELECT 语句就可以了:

SELECT basedate, quotes.*
FROM
(
SELECT basedate, min(date) AS nextDate
FROM
(
SELECT * FROM
(SELECT date as basedate FROM quotes WHERE Valuation > 5) as dates
LEFT JOIN quotes ON dates.basedate < quotes.date
) as aggrtable
GROUP BY basedate
) as fullTable
LEFT JOIN quotes ON fullTable.nextDate = quotes.date;

让我们从内到外检查一下:

  • 最里面的 SELECT 语句检索对所有 VALUATION > 5 感兴趣的引号。条件成立的那些日期在此处称为 basedate
  • 下一层对表本身进行非等值连接,确定“在”我们的基准日期“之后”的所有可能日期。
  • 别名 aggrtable 确定日期,这些日期“晚于”基准日期,但最接近基准日期(使用 min 聚合函数)。
  • 为了最终再次从 quotes 中检索值,结果再次与原始表连接,使连接条件成为基准日期的“最小最近日期”。

注意:这种非相等连接在大表上可能会变得丑陋:假设我们在数据库中有几十年的日期。第二天,估值超过 5。然后这个非等值连接将在结果中生成除前两个以​​外的所有日期。因此,如果你运气不好,这可能会导致 O(n²) 记录,这些记录需要临时生成,但随后会通过 min 的聚合再次压缩。因此,您的结果集最多只有 O(n) 记录,但可能需要 O(n²) 时间/空间。您还可以使用 EXPLAIN 语句来交叉检查此讨论;在那里你会发现一个 EXTRA = "Using temporary, Using filesort" 这在性能方面是非常糟糕的。

关于MySQL:选择上面的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37635278/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com