首页 > 解决方案 > 仅显示价格满足条件的行(与最近的价格行相比)

问题描述

我有 2 张表: 带有硬币名称和当前价格的硬币 带有用户设置警报的警报

我想显示触发警报的结果,

即如果硬币蛋糕达到 21 警报“H 20”(更高的 20)将触发

如果硬币蛋糕低于 11 警报“L 11) (lower 11) 将触发

我可以用很多查询来做,但我只想用一个来做......

问题:

table ALERTS

id | user  |  coin  |  se  |  pricealert
----------------------------------------
1  | 15    | cake   |  H   |  20
2  | 15    | cake   |  L   |  11
3  | 21    | sbdo   |  H   |  8000
4  | 15    | bnb    |  H   |  300
5  | 21    | bnb    |  H   |  280
7  | 15    | bnb    |  L   |  200
8  | 15    | mds    |  L   |  5000

table COINS (* most recent date)
coin   | value   | data
---------------------------------
cake   |    12   | 2021-03-22
cake   |    13   | 2021-03-23
**cake |    14   | 2021-03-24**
bnb    |   250   | 2021-03-22
bnb    |   270   | 2021-03-23
**bnb  |   330   | 2021-03-24**
mds    |  5900   | 2021-03-23
**mds  |  4700   | 2021-03-24**
sbdo   |  6000   | 2021-03-23
**sbdo |  6700   | 2021-03-24**

wanted RESULTS
id | user | coin   | se    | pricealert  | currentprice
4  | 15   | bnb    |  H    |   300       |   330
5  | 21   | bnb    |  H    |   280       |   330
8  | 15   | mds    |  L    |  5000       |  4700

我可以考虑一一查询,但我只想在 1 次查询中进行查询,这是为了获取硬币的最新值(我认为不是最佳解决方案)

SELECT  MAX(data), valore, coin 
FROM coins WHERE data>(NOW() - INTERVAL 24 HOUR)  
GROUP BY coin

这是来自选择结果?

SELECT * 
FROM results 
WHERE (currentprice<pricealert and se='L') 
   OR (currentprice>pricealert and se='H')

标签: mysqlsql

解决方案


这是一种方法:

select* from (
   select *, rank() over (partition by coin order by date desc) rn 
   from coins 
) c
join alerts a
 on a.coin = c.coin
 and rn = 1
 and ( 
       (c.value > a.pricealert and a.se='H')
       OR (c.value < a.pricealert and a.se='L')
      ) 

好像你的 mysql 版本太旧,不支持 row_number 或 rank() 窗口函数,所以你可以使用下面的查询:

select c.* 
from (
   select coin, max(date) date
   from coins 
   group by coin
) mc
join coin on c.coin = mc.coin and c.date = mc.date
join alerts a on a.coin = c.coin
 and ((c.value > a.pricealert and a.se='H')
   OR (c.value < a.pricealert and a.se='L')
      ) 

推荐阅读