,count(distinct case when taggeddate>current_date-7 and pojie=1 then order_id end) as sa_pojie7_count postgresql 如何修改代码
时间: 2024-10-09 17:01:33 浏览: 64
在PostgreSQL中,如果你想计算过去7天内标记为"pojie"(假设这是一个布尔型或整数标识)且有订单记录的唯一订单ID的数量,原始代码可能不太精确。这里有一个建议的修正版:
```sql
SELECT COUNT(DISTINCT CASE WHEN tagged_date >= CURRENT_DATE - INTERVAL '7 days' AND pojie = 1 THEN order_id END) AS sa_pojie7_count
FROM your_table;
```
这里的改动包括:
- 使用 `INTERVAL '7 days'` 而不是 `current_date-7` 来确保时间间隔的精确计算。
- 删除了不必要的 `end` 关键字,因为CASE语句本身就是完整的表达式。
- 确保`tagged_date`列是日期类型并且已经进行了正确的比较。
如果`taggeddate`是一个字符串,需要先转换成日期类型,如:
```sql
SELECT COUNT(DISTINCT CASE WHEN EXTRACT(DAY FROM (DATE(taggeddate))::DATE) >= EXTRACT(DAY FROM CURRENT_DATE - INTERVAL '7 days') AND pojie = 1 THEN order_id END) AS sa_pojie7_count
FROM your_table;
```
相关问题
select a.month_id, sum(b.aa) aa, sum(b.bb) bb, sum(b.cc) cc, '今年往月新增订购' as A from ( select month_id, sum(aa) aa,sum(bb) bb,sum(cc) cc from ( select month_id , count(distinct case when offer_type_name='主套餐' then offer_name end) aa, count(distinct case when offer_type_name='促销' then offer_name end) bb, count(distinct case when offer_type_name='可选包' then offer_name end) cc, from dwd_sum_zhuliuxxsc where substring(crt_version,1,4)='2023' group by month_id ) ptuser group by month_id ) a join ( select month_id,sum(aa) aa,sum(bb) bb,sum(cc) cc from ( select month_id , count(distinct case when offer_type_name='主套餐' then offer_name end) aa, count(distinct case when offer_type_name='促销' then offer_name end) bb, count(distinct case when offer_type_name='可选包' then offer_name end) cc, from dwd_sum_zhuliuxxsc where substring(crt_version,1,4)='2023' group by month_id ) ptuser group by month_id ) b on a.month_id >= b.month_id group by a.month_id order by a.month_id;如何改成计算今年往月(不包含本月)的统计
您可以将子查询中的 `where substring(crt_version,1,4)='2023'` 改为 `where year(crt_version) = year(current_date()) and month_id < month(current_date())`,这样就只会统计今年往月的数据(不包含本月)。修改后的 SQL 语句如下:
```
select a.month_id,
sum(b.aa) aa,
sum(b.bb) bb,
sum(b.cc) cc,
'今年往月新增订购' as A
from (
select month_id, sum(aa) aa,sum(bb) bb,sum(cc) cc
from (
select month_id,
count(distinct case when offer_type_name='主套餐' then offer_name end) aa,
count(distinct case when offer_type_name='促销' then offer_name end) bb,
count(distinct case when offer_type_name='可选包' then offer_name end) cc
from dwd_sum_zhuliuxxsc
where year(crt_version) = year(current_date()) and month_id < month(current_date())
group by month_id
) ptuser
group by month_id
) a
join (
select month_id,sum(aa) aa,sum(bb) bb,sum(cc) cc
from (
select month_id,
count(distinct case when offer_type_name='主套餐' then offer_name end) aa,
count(distinct case when offer_type_name='促销' then offer_name end) bb,
count(distinct case when offer_type_name='可选包' then offer_name end) cc
from dwd_sum_zhuliuxxsc
where year(crt_version) = year(current_date()) and month_id < month(current_date())
group by month_id
) ptuser
group by month_id
) b
on a.month_id >= b.month_id
group by a.month_id
order by a.month_id;
```
注意,这里的 `current_date()` 函数是 MySQL 中获取当前日期的函数,如果您使用的是其他数据库,获取当前日期的函数可能有所不同。
SELECT DISTINCT qianniuuser_id,DATE(client_date) AS login_date FROM ( SELECT pt, type, event_id, cast(get_json_object(params, '$.qianniuUserId') AS BIGINT) AS qianniuuser_id, FROM_UNIXTIME(CAST(IF(LENGTH(client_timestamp) = 10,client_timestamp,client_timestamp / 1000) AS BIGINT)) AS client_date FROM ( SELECT pt, type, event_id, params,client_timestamp -- 这里暂时还是用旧表,数据周期长一些,后续补数合并后统一用小时表: FROM mogic.ods_log_burial_point_full -- 这里需要确认下是否为自然月:【按照每周的区间分别统计】 WHERE pt >= '20230428' AND pt <= '20230531' ) a ) temp WHERE type = 'behavior' AND event_id = 'show_compose_result'. 用户留存数和留存率只要在3日有第二次登陆都算留存,7日内有第二次登陆也算7日留存,14日内有第二次登陆也算14日留存,30日内有第二次登陆也算30日留存,现在要求不同的日期,用户数和他的3日留存数,3留存率,7日留存数,7日留存率,14日留存数,14日留存率,30日留存数,30日留存率,这个sql要怎么写用户id就是qianniuuser_id,日期就是login_date
感谢您的问题,以下是我给出的 SQL 语句:
```
SELECT
login_date AS 日期,
COUNT(DISTINCT qianniuuser_id) AS 用户数,
COUNT(DISTINCT CASE WHEN DATEDIFF(login_date, second_login_date) <= 3 THEN qianniuuser_id END) AS 3日留存数,
COUNT(DISTINCT CASE WHEN DATEDIFF(login_date, second_login_date) <= 3 THEN qianniuuser_id END) / COUNT(DISTINCT qianniuuser_id) AS 3日留存率,
COUNT(DISTINCT CASE WHEN DATEDIFF(login_date, second_login_date) <= 7 THEN qianniuuser_id END) AS 7日留存数,
COUNT(DISTINCT CASE WHEN DATEDIFF(login_date, second_login_date) <= 7 THEN qianniuuser_id END) / COUNT(DISTINCT qianniuuser_id) AS 7日留存率,
COUNT(DISTINCT CASE WHEN DATEDIFF(login_date, second_login_date) <= 14 THEN qianniuuser_id END) AS 14日留存数,
COUNT(DISTINCT CASE WHEN DATEDIFF(login_date, second_login_date) <= 14 THEN qianniuuser_id END) / COUNT(DISTINCT qianniuuser_id) AS 14日留存率,
COUNT(DISTINCT CASE WHEN DATEDIFF(login_date, second_login_date) <= 30 THEN qianniuuser_id END) AS 30日留存数,
COUNT(DISTINCT CASE WHEN DATEDIFF(login_date, second_login_date) <= 30 THEN qianniuuser_id END) / COUNT(DISTINCT qianniuuser_id) AS 30日留存率
FROM (
SELECT DISTINCT
qianniuuser_id,
DATE(client_date) AS login_date,
MIN(CASE WHEN DATEDIFF(DATE(client_date), second_login_date) >= 0 THEN second_login_date ELSE NULL END) AS second_login_date
FROM (
SELECT
pt,
type,
event_id,
CAST(GET_JSON_OBJECT(params, '$.qianniuUserId') AS BIGINT) AS qianniuuser_id,
FROM_UNIXTIME(CAST(IF(LENGTH(client_timestamp) = 10, client_timestamp, client_timestamp / 1000) AS BIGINT)) AS client_date,
LAG(FROM_UNIXTIME(CAST(IF(LENGTH(client_timestamp) = 10, client_timestamp, client_timestamp / 1000) AS BIGINT))) OVER
(PARTITION BY CAST(GET_JSON_OBJECT(params, '$.qianniuUserId') AS BIGINT) ORDER BY client_date) AS second_login_date
FROM (
SELECT
pt,
type,
event_id,
params,
client_timestamp
FROM mogic.ods_log_burial_point_full
WHERE pt >= '20230428' AND pt <= '20230531'
) a
WHERE type = 'behavior' AND event_id = 'show_compose_result'
) temp
WHERE second_login_date IS NOT NULL
GROUP BY qianniuuser_id, DATE(client_date)
) t
GROUP BY login_date;
```
解释一下这个 SQL 语句的思路:
首先,我们需要找到每个用户的第二次登录时间,所以我们使用了一个包含了 LAG 函数的子查询:
```
SELECT
pt,
type,
event_id,
CAST(GET_JSON_OBJECT(params, '$.qianniuUserId') AS BIGINT) AS qianniuuser_id,
FROM_UNIXTIME(CAST(IF(LENGTH(client_timestamp) = 10, client_timestamp, client_timestamp / 1000) AS BIGINT)) AS client_date,
LAG(FROM_UNIXTIME(CAST(IF(LENGTH(client_timestamp) = 10, client_timestamp, client_timestamp / 1000) AS BIGINT))) OVER
(PARTITION BY CAST(GET_JSON_OBJECT(params, '$.qianniuUserId') AS BIGINT) ORDER BY client_date) AS second_login_date
FROM (
SELECT
pt,
type,
event_id,
params,
client_timestamp
FROM mogic.ods_log_burial_point_full
WHERE pt >= '20230428' AND pt <= '20230531'
) a
WHERE type = 'behavior' AND event_id = 'show_compose_result'
```
然后,我们需要找到每个用户的每次登录时间,并和第二次登录时间进行比较,筛选出符合条件的用户,最后按照日期进行统计:
```
SELECT
login_date AS 日期,
COUNT(DISTINCT qianniuuser_id) AS 用户数,
COUNT(DISTINCT CASE WHEN DATEDIFF(login_date, second_login_date) <= 3 THEN qianniuuser_id END) AS 3日留存数,
COUNT(DISTINCT CASE WHEN DATEDIFF(login_date, second_login_date) <= 3 THEN qianniuuser_id END) / COUNT(DISTINCT qianniuuser_id) AS 3日留存率,
COUNT(DISTINCT CASE WHEN DATEDIFF(login_date, second_login_date) <= 7 THEN qianniuuser_id END) AS 7日留存数,
COUNT(DISTINCT CASE WHEN DATEDIFF(login_date, second_login_date) <= 7 THEN qianniuuser_id END) / COUNT(DISTINCT qianniuuser_id) AS 7日留存率,
COUNT(DISTINCT CASE WHEN DATEDIFF(login_date, second_login_date) <= 14 THEN qianniuuser_id END) AS 14日留存数,
COUNT(DISTINCT CASE WHEN DATEDIFF(login_date, second_login_date) <= 14 THEN qianniuuser_id END) / COUNT(DISTINCT qianniuuser_id) AS 14日留存率,
COUNT(DISTINCT CASE WHEN DATEDIFF(login_date, second_login_date) <= 30 THEN qianniuuser_id END) AS 30日留存数,
COUNT(DISTINCT CASE WHEN DATEDIFF(login_date, second_login_date) <= 30 THEN qianniuuser_id END) / COUNT(DISTINCT qianniuuser_id) AS 30日留存率
FROM (
SELECT DISTINCT
qianniuuser_id,
DATE(client_date) AS login_date,
MIN(CASE WHEN DATEDIFF(DATE(client_date), second_login_date) >= 0 THEN second_login_date ELSE NULL END) AS second_login_date
FROM (
-- 上面的子查询
) temp
WHERE second_login_date IS NOT NULL
GROUP BY qianniuuser_id, DATE(client_date)
) t
GROUP BY login_date;
```
希望这个 SQL 语句能够帮到您,如果您有任何问题,请随时问我。
阅读全文
相关推荐














