场景:
最近检查数据库, 需要查询最近几天的数据, 之前一直用的 desc limit 1 查询最后一天的数据,SQL如下
-- 查询 t_master_stock_daily_fond 中 的最新一天的所有记录
SELECT
id,
trade_date,
fund_account,
fund_balance,
available_funds,
frozen_capital,
record_time,
total_assets
FROM
t_master_stock_daily_fond
WHERE
trade_date = (
SELECT
trade_date
FROM
t_master_stock_daily_fond
GROUP BY
trade_date DESC
LIMIT 1
);
主要是嵌套子句把最后一天日期查询出来, 直接where子句查询
但是如果查询最后两天,就不能使用这种方法, 使用in也不行, 会报错,语句如下
-- 查询 t_master_stock_daily_fond 中 的最新一天的所有记录
SELECT
id,
trade_date,
fund_account,
fund_balance,
available_funds,
frozen_capital,
record_time,
total_assets
FROM
t_master_stock_daily_fond
WHERE
trade_date in (
SELECT
trade_date
FROM
t_master_stock_daily_fond
GROUP BY
trade_date DESC
LIMIT 2
);
-- 报错:[Err] 1235 - This version of MySQL doesn't yet support 'LIMIT & IN/ALL/ANY/SOME subquery'
-- 查询 t_master_stock_daily_fond 中 的最新一天的所有记录
SELECT
id,
trade_date,
fund_account,
fund_balance,
available_funds,
frozen_capital,
record_time,
total_assets
FROM
t_master_stock_daily_fond
WHERE
trade_date = (
SELECT
trade_date
FROM
t_master_stock_daily_fond
GROUP BY
trade_date DESC
LIMIT 2
);
-- 报错:[Err] 1242 - Subquery returns more than 1 row
解决方式:
上网查询发现两种方法
原贴地址:https://www.cnblogs.com/panda-yichen/p/11752214.html
#方法一
SELECT
count(DISTINCT(id)) ,
count(DISTINCT(pid))
FROM
push_platform_upd
WHERE
datediff(NOW(), last_dt) <= 30
#方法二
SELECT
count(DISTINCT(id)) ,
count(DISTINCT(pid))
FROM
push_platform_upd
WHERE
last_dt >= DATE_SUB(
DATE_FORMAT(NOW(), '%Y-%m-%d'),
INTERVAL 30 DAY
)
第一种方法的函数解释
原贴地址:https://www.w3school.com.cn/sql/func_datediff_mysql.asp
DATEDIFF()定义和用法
DATEDIFF() 函数返回两个日期之间的天数。
语法
DATEDIFF(date1,date2)
date1 和 date2 参数是合法的日期或日期/时间表达式。
注释:只有值的日期部分参与计算。
第二种方法的函数解释
第二种方法暂时没有去使用,待后续补充
拓展:
除了按照日期查, 有时也需要按照类型的数据来分组查询, 待补充各种数据的分组查询,排序分组查询方式,按集合分组查询方式等