Mysql 获取最近一天的返回

Mysql 获取最近一天的返回,mysql,Mysql,我正在运行一个mysql-10.1.39-MariaDB-MariaDB.org二进制数据库 我有下表: | id | date | product_name | close | |----|---------------------|--------------|-------| | 1 | 2019-08-07 00:00:00 | Product 1 | 806 | | 2 | 2019-08-06 00:00:00 | Product 1

我正在运行一个mysql-10.1.39-MariaDB-MariaDB.org二进制数据库

我有下表:

| id | date                | product_name | close |
|----|---------------------|--------------|-------|
| 1  | 2019-08-07 00:00:00 | Product 1    | 806   |
| 2  | 2019-08-06 00:00:00 | Product 1    | 982   |
| 3  | 2019-08-05 00:00:00 | Product 1    | 64    |
| 4  | 2019-08-07 00:00:00 | Product 2    | 874   |
| 5  | 2019-08-06 00:00:00 | Product 2    | 739   |
| 6  | 2019-08-05 00:00:00 | Product 2    | 555   |
| 7  | 2019-08-07 00:00:00 | Product 3    | 762   |
| 8  | 2019-08-06 00:00:00 | Product 3    | 955   |
| 9  | 2019-08-05 00:00:00 | Product 3    | 573   |
我希望获得以下输出:

| id | date                | product_name | close | daily_return |
|----|---------------------|--------------|-------|--------------|
| 4  | 2019-08-07 00:00:00 | Product 2    | 874   | 0,182679296  |
| 1  | 2019-08-07 00:00:00 | Product 1    | 806   | -0,179226069 |
基本上,我想得到回报最高的前两名产品。而回报率是通过每个产品的“当前日关闭-前一日关闭/前一日关闭”计算的

我尝试了以下方法:

SELECT
    *,
    (
        CLOSE -(
        SELECT
            (t2.close)
        FROM
            prices t2
        WHERE
            t2.date < t1.date
        ORDER BY
            t2.date
        DESC
    LIMIT 1
    )
    ) /(
    SELECT
        (t2.close)
    FROM
        prices t2
    WHERE
        t2.date < t1.date
    ORDER BY
        t2.date
    DESC
LIMIT 1
) AS daily_return
FROM
    prices t1
WHERE DATE >= DATE(NOW()) - INTERVAL 1 DAY
这给了我每个产品名称的回报


如何获取上一个产品名称并按最高的日回报率对其进行排序?

您可以通过自助加入来完成:

select 
  p.*, 
  cast((p.close - pp.close) / pp.close as decimal(20, 10)) as daily_return 
from prices p left join prices pp
on p.product_name = pp.product_name 
   and pp.date = date_add(p.date, interval -1 day)
order by p.date desc, daily_return desc, p.product_name 
limit 2
看。 结果:


您可以通过自连接来完成此操作:

select 
  p.*, 
  cast((p.close - pp.close) / pp.close as decimal(20, 10)) as daily_return 
from prices p left join prices pp
on p.product_name = pp.product_name 
   and pp.date = date_add(p.date, interval -1 day)
order by p.date desc, daily_return desc, p.product_name 
limit 2
看。 结果:

问题陈述:在表中查找在最新日期(即最大日期)回报率最高的前两个产品

解决方案:

若你们有一个日期字段的索引,它会非常快。 只扫描表一次,并使用日期过滤器索引将允许MySQL只处理给定日期范围的行。 用户定义的变量@old_close用于查找返回值。注意这里我们需要基于产品和日期的分类数据。 不依赖于此日期参数的另一个版本

SELECT * 
FROM (
    SELECT
        prices.*,
        CAST((`close` - @old_close) / @old_close AS DECIMAL(20, 10))  AS daily_return, -- Use @old_case, currently it has value of old row, next column will set it to current close value.
        @old_close:= `close`    -- Set @old_close to close value of this row, so it can be used in next row
    FROM prices,
    (SELECT @old_close:= 0 as o_c) AS t 
    ORDER BY product_name, `date` ASC 
) AS tt
ORDER BY `date` DESC, daily_return DESC
LIMIT 2
问题陈述:在表中查找在最新日期(即最大日期)回报率最高的前两个产品

解决方案:

若你们有一个日期字段的索引,它会非常快。 只扫描表一次,并使用日期过滤器索引将允许MySQL只处理给定日期范围的行。 用户定义的变量@old_close用于查找返回值。注意这里我们需要基于产品和日期的分类数据。 不依赖于此日期参数的另一个版本

SELECT * 
FROM (
    SELECT
        prices.*,
        CAST((`close` - @old_close) / @old_close AS DECIMAL(20, 10))  AS daily_return, -- Use @old_case, currently it has value of old row, next column will set it to current close value.
        @old_close:= `close`    -- Set @old_close to close value of this row, so it can be used in next row
    FROM prices,
    (SELECT @old_close:= 0 as o_c) AS t 
    ORDER BY product_name, `date` ASC 
) AS tt
ORDER BY `date` DESC, daily_return DESC
LIMIT 2

您提供了两个相互冲突的规格:回报率最高的前两个产品和按每日回报率最高排序的最后一个产品名称。是否存在我们没有连续日期的情况?比如5号之后,我们的产品直接有7号或8号。您提供了两个相互冲突的规格:回报率最高的前2个产品和按每日回报率最高排序的最后一个产品名称。是否存在我们没有连续日期的情况?就像在5点之后,我们有直接的7或8个产品。Thx很多!很好用!一个权衡是,查询在一大组行上似乎非常慢——我在这个表中有超过10k行。有什么建议可以加快查询速度吗?谢谢你的回复!在product_name和date列上的索引会有所帮助。也许我很困惑,-0.179226069是产品1的最高回报吗?它应该用于id 2,其中返回值为982-64/64。如果我错过了什么,请告诉我。@JitendraYadav你说得对!我的最新记录为空!太多了!很好用!一个权衡是,查询在一大组行上似乎非常慢——我在这个表中有超过10k行。有什么建议可以加快查询速度吗?谢谢你的回复!在product_name和date列上的索引会有所帮助。也许我很困惑,-0.179226069是产品1的最高回报吗?它应该用于id 2,其中返回值为982-64/64。如果我错过了什么,请告诉我。@JitendraYadav你说得对!我的最新记录为空@安娜.克莱,我的问题陈述符合你的要求吗?如果是,请验证我的答案,如果不是,请告诉我需要涵盖哪些场景。@Anna.Klee,我的问题陈述是否符合您的要求?如果是,请验证我的答案,如果不是,请告诉我需要涵盖哪些场景。