Mysql s: 您需要一个规则表或一些规则配置(我们称之为SMLimitDef),它看起来像是直接在表中输入的: 接下来,您需要一个查询或视图来计算您的第一个事务(称为vFirstUserTransMatch),它看起来像这样: 接下来,您需要一个汇总视图或查询来汇总每个用户每月的事务 接下来,您需要一个查询,根据您的条件将所有内容放在一起: 最后,你可以做你的总结
正如我所说,如果您使用的是mySQL 8,那么所有内容都可以在一个查询中使用“With”语句,但是对于您的版本,为了可读性和简单性,您需要视图,否则您仍然可以将这些视图的sql嵌入到最终的sql中 小提琴看起来像Mysql s: 您需要一个规则表或一些规则配置(我们称之为SMLimitDef),它看起来像是直接在表中输入的: 接下来,您需要一个查询或视图来计算您的第一个事务(称为vFirstUserTransMatch),它看起来像这样: 接下来,您需要一个汇总视图或查询来汇总每个用户每月的事务 接下来,您需要一个查询,根据您的条件将所有内容放在一起: 最后,你可以做你的总结,mysql,sql,Mysql,Sql,正如我所说,如果您使用的是mySQL 8,那么所有内容都可以在一个查询中使用“With”语句,但是对于您的版本,为了可读性和简单性,您需要视图,否则您仍然可以将这些视图的sql嵌入到最终的sql中 小提琴看起来像 与看起来像的版本8相比,它不是。请检查我的提琴请制定任务的最终形式,它的历史对我们来说并不有趣。并指定精确的MySQL版本。@Akina在他使用的小提琴中5.7.33@MarcoLuzzara小提琴中没有免费的版本选择。而且可能真实的服务器版本与fiddle中选择的版本不匹配,所以显式
与看起来像的版本8相比,它不是。请检查我的提琴请制定任务的最终形式,它的历史对我们来说并不有趣。并指定精确的MySQL版本。@Akina在他使用的小提琴中
5.7.33
@MarcoLuzzara小提琴中没有免费的版本选择。而且可能真实的服务器版本与fiddle中选择的版本不匹配,所以显式的版本指定可能很有用。请检查我的提琴请制定任务的最终形式,它的历史对我们来说并不有趣。并指定精确的MySQL版本。@Akina在他使用的小提琴中5.7.33
@MarcoLuzzara小提琴中没有免费的版本选择。而且可能真实的服务器版本与fiddle中选择的版本不匹配-因此明确的版本指定可能很有用。im使用mysql 5.7这只适用于三月,但当我在WHERE DATE_格式(createdAt,'%Y%m')='202103'
中将其更改为WHERE DATE_格式(createdAt,'%Y%m')='202102'
(当我想在2月份找到明星会员
时,3月份仍然是一样的,而其唯一的用户id 16计数用户id是1
@18818181881谢谢,现在就试试。但是,如果这不是你想要的,请用一些例子更新你的问题,以便我们能够更好地理解你的问题谢谢你的回复。)r、 我想做一个查询,找出star成员,在3月份的这个案例中,你做得对,但假设我想在2021年4月找到,然后我想它会像更改WHERE DATE_格式一样简单(createdAt,“%Y%m”)=
就像我的第一个查询一样,当我想找出另一个月时,我只需将的求和(年和月='年和月'
这只适用于三月,但当我将其更改为何处日期格式(createdAt,%Y%m')='202103'
为何处日期格式(createdAt,%Y%m')='202102'
(当我想在2月份找到明星会员
时,3月份仍然是一样的,而其唯一的用户id 16计数用户id是1
@18818181881谢谢,现在就试试。但是,如果这不是你想要的,请用一些例子更新你的问题,以便我们能够更好地理解你的问题谢谢你的回复。)r、 我想做一个查询,找出star成员,在3月份的这个案例中,你做得对,但假设我想在2021年4月找到,然后我想它会像更改WHERE DATE_格式一样简单(createdAt,“%Y%m”)=
就像我的第一个查询一样,当我想找出另一个月时,我只需在中更改SUM(year\u and\u month='year\u and\u month'
这太棒了,到目前为止还不错,我只是想知道,所以基本上SMLimitDef
表是用来根据我的情况生成条件的吗?(关于700000
和350000
中的交易,当我将其从和月(osm.createdAt)=3和年(osm.createdAt)=2021更改为和月(osm.createdAt)=1和年(osm.createdAt)=2021
为什么count user_id只有1,而应该是2,因为用户_id 15和16都在2021年1月进行他的第一次交易,并且交易量>=700000。请检查我的提琴,我认为这是因为此查询只在1个用户中查找1个交易,而应该查看每个用户的总交易量因此,它只考虑用户ID 16作为一个明星成员,因为交易直接在<代码> 700000 <代码>,而UsSersID 15有2个交易在<代码> 350000 < /C>和<代码> 400000 < /代码>是的,SMLimitDef是你的条件。好,所以明星会员是累积的月。有意义。我将修改FITS是极好的,到目前为止,G。ood,我只是想知道,所以基本上SMLimitDef
表是用来根据我的情况来创建条件的?(关于700000
和350000
中的事务,当我将其从和月(osm.createdAt)=3和年(osm.createdAt)=2021
更改为和月(osm.createdAt)=1和年(osm.createdAt)=2021
为什么count user_id只有1,而应该是2,因为用户_id 15和16都在2021年1月进行他的第一次交易,并且交易量>=700000。请检查我的提琴,我认为这是因为此查询只在1个用户中查找1个交易,而应该查看每个用户的总交易量因此,它只考虑用户ID 16作为一个明星成员,因为交易直接在<代码> 700000 <代码>,而UsSersID 15有2个事务在<代码> 350000 <代码>和<代码> 400000 < /代码>是的,SMLimitDef是你的条件。好了,明星成员是累积的月。有意义。我会修改,以适应。
+-------------------+------+-------+
| count_star_member | year | month |
+-------------------+------+-------+
| 2 | 2021 | 1 |
| 1 | 2021 | 3 |
+-------------------+------+-------+
SELECT min_year, min_month, COUNT(users_id)
FROM (
SELECT osm2.users_id, YEAR(min_createdAt) min_year, MONTH(min_createdAt) min_month, SUM(total_price_star_member) sum_price
FROM (
SELECT users_id, MIN(createdAt) min_createdAt
FROM order_star_member
GROUP BY users_id
) AS osm1
JOIN order_star_member osm2 ON osm1.users_id = osm2.users_id
WHERE DATE_FORMAT(osm2.createdAt, '%Y%m') = DATE_FORMAT(osm1.min_createdAt, '%Y%m')
GROUP BY osm2.users_id, min_createdAt
) t1
WHERE users_id IN (
SELECT users_id
FROM (
SELECT users_id, DATE_FORMAT(createdAt, '%Y-%m-01') month_createdAt
FROM order_star_member
WHERE DATE_FORMAT(createdAt, '%Y%m') = '202103'
GROUP BY users_id, DATE_FORMAT(createdAt, '%Y-%m-01')
HAVING SUM(total_price_star_member) >= (
CASE
WHEN date(month_createdAt) < date '2021-03-01' THEN 700000
ELSE 350000
END
)
) t3
) AND
(((min_year < 2021 OR min_month < 3) AND t1.sum_price >= 700000) OR
((min_year = 2021 AND min_month = 3) AND t1.sum_price >= 350000))
GROUP BY min_year, min_month
SELECT users_id, MIN(createdAt) min_createdAt
FROM order_star_member
GROUP BY users_id
SELECT osm2.users_id, YEAR(min_createdAt) min_year, MONTH(min_createdAt) min_month, SUM(total_price_star_member) sum_price
FROM osm1
JOIN order_star_member osm2 ON osm1.users_id = osm2.users_id
WHERE DATE_FORMAT(osm2.createdAt, '%Y%m') = DATE_FORMAT(osm1.min_createdAt, '%Y%m')
GROUP BY osm2.users_id, min_createdAt
SELECT users_id
FROM (
SELECT users_id, DATE_FORMAT(createdAt, '%Y-%m-01') month_createdAt
FROM order_star_member
WHERE DATE_FORMAT(createdAt, '%Y%m') = '202102'
GROUP BY users_id, DATE_FORMAT(createdAt, '%Y-%m-01')
HAVING SUM(total_price_star_member) >= (
CASE
WHEN date(month_createdAt) < date '2021-03-01' THEN 700000
ELSE 350000
END
)
) t3
SELECT min_year, min_month, COUNT(users_id)
FROM t1
WHERE users_id IN (...) AND
(((min_year < 2021 OR min_month < 3) AND t1.sum_price >= 700000) OR
((min_year = 2021 AND min_month = 3) AND t1.sum_price >= 350000))
GROUP BY min_year, min_month
insert into SMLimitDef(sEffDate,eEffDate,priceLimit)
VALUES('1980-01-01','2021-02-28',700000),
('2021-03-01','2999-12-31',350000);
create view vFirstUserTransMatch as
SELECT *,month(osm.createdAt) as createMonth, year(osm.createdAt) as createYear
FROM order_star_member osm
where createdAt=(select MIN(createdAt) from order_star_member b
where b.users_id=osm.users_id
)
create view vOSMSummary as
SELECT users_id,month(osm.createdAt) as createMonth, year(osm.createdAt) as createYear, sum(total_price_star_member) as totalPrice
FROM order_star_member osm
group by users_id,month(osm.createdAt), year(osm.createdAt);
select osm.*,futm.createMonth as firstMonth, futm.createYear as firstYear
from vOSMSummary osm
inner join vFirstUserTransMatch futm
on osm.users_id=futm.users_id
where exists(select 'x' from SMLimitDef c
where osm.createMonth between Month(c.sEffDate) and Month(c.eEffDate)
and osm.createYear between Year(c.sEffDate) and Year(c.eEffDate)
and osm.totalPrice>=c.pricelimit
)
and osm.CreateMonth=3 and osm.createYear=2021
SELECT COUNT(users_id) count_star_member,
firstYear `year`,
firstMonth `month`
FROM (
select osm.*,futm.createMonth as firstMonth, futm.createYear as firstYear
from vOSMSummary osm
inner join vFirstUserTransMatch futm
on osm.users_id=futm.users_id
where exists(select 'x' from SMLimitDef c
where osm.createMonth between Month(c.sEffDate) and Month(c.eEffDate)
and osm.createYear between Year(c.sEffDate) and Year(c.eEffDate)
and osm.totalPrice>=c.pricelimit
)
and osm.CreateMonth=3 and osm.createYear=2021
) d
group by firstYear, firstMonth