gpt4 book ai didi

mysql - 如何在不使用标准 mod 方法的情况下返回每第 n 行

转载 作者:行者123 更新时间:2023-11-29 06:54:42 28 4
gpt4 key购买 nike

我有一个保存加密货币价格数据的数据库。价格数据请求如下所示:

SELECT timestamp, price FROM PRICES 
WHERE timestamp > 1504703321
AND timestamp < 1504707321
AND exchange = (SELECT exid FROM EXCHANGES WHERE name = "exchange_name")
AND market = (SELECT mid FROM MARKETS WHERE name = "market_name")
AND side = (SELECT sid FROM SIDES WHERE name = "ASK")
AND id % 2 = 0
ORDER BY timestamp ASC";

应该非常简单。为了使这篇文章简短,我不会写下有关其他表的更多信息。如果您需要更多信息,请随时询问,我会添加它。

如您所见,我使用“标准”mod 方法 ( AND id % 2 = 0 ) 来获取每隔一行。但是,我遇到了一个问题:

用数据填充表的程序总是以相同的顺序添加新数据。假设我有两个交换机,名为 Aexid 1Bexid 2 。首先,一行 A添加,然后添加一行 B ,然后是 A 的一行再次,然后B一遍又一遍,依此类推。

结果将是:

id    exchange    ...
1 1 ...
2 2 ...
3 1 ...
4 2 ...

对于每个id % 2哪里exchange = 1结果始终是 != 0 ,这意味着上述查询的结果将为空。

如果可能的话,我想仅通过修改SQL语句来解决这个问题,这意味着数据库/表和软件保持不变,并尽可能少地损失性能。该表最多可容纳 400 万行。

有办法实现吗?

最佳答案

使用子查询并添加新列:

SELECT timestamp, price
FROM (SELECT p.timestamp, p.price, (@rn := @rn + 1) as rn
FROM PRICES p CROSS JOIN
(SELECT @rn := 0) params
WHERE timestamp > 1504703321 AND
timestamp < 1504707321 AND
exchange = (SELECT exid FROM EXCHANGES WHERE name = 'exchange_name') AND
market = (SELECT mid FROM MARKETS WHERE name = 'market_name') AND
side = (SELECT sid FROM SIDES WHERE name = 'ASK')
) p
WHERE rn % 2 = 0
ORDER BY timestamp ASC;

关于mysql - 如何在不使用标准 mod 方法的情况下返回每第 n 行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46077834/

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