SELECT
COUNT(create_user_id)::int AS y,
x
FROM
(
SELECT
create_user_id, create_time::abstime::date AS x
FROM
table1 AS s
WHERE
(
create_user_id = 16
OR
update_user_id = 16
)
AND
(
CASE WHEN create_user_id = 16 THEN
TIMESTAMP 'epoch' + create_time * INTERVAL '1 second'
BETWEEN
'2015-03-09'
AND
'2016-03-09'
WHEN update_user_id = 16 THEN
TIMESTAMP 'epoch' + update_time * INTERVAL '1 second'
BETWEEN
'2015-03-09'
AND
'2016-03-09'
END
)
) AS res
GROUP BY x ORDER BY x
输出
{
235;"2014-11-29"
48;"2014-12-11"
8;"2014-12-12"
55;"2014-12-13"
8;"2014-12-16"
49;"2014-12-17"
9;"2014-12-18"
13;"2014-12-19"
21;"2014-12-21"
18;"2016-02-22"
29;"2016-02-23"
4;"2016-02-27"
21;"2016-02-28"
}
第一个版本是
SELECT
COUNT(create_user_id)::int AS y,
x
FROM
(
SELECT
create_user_id, create_time::abstime::date AS x
FROM
table1 AS s
WHERE
(
create_user_id = 16
OR
update_user_id = 16
)
AND
(
CASE WHEN create_user_id = 16 THEN
create_time
BETWEEN
1449612000
AND
1457474400
WHEN update_user_id = 16 THEN
update_time
BETWEEN
1449612000
AND
1457474400
END
)
) AS res
GROUP BY x ORDER BY x
我的问题是为什么列表以2014-11-29
开头,以及我如何修复它。我尝试过不同的数据格式,例如09.03.2015
。
如果我删除WHEN update_user_id = 16.....AND 1457474400
,那么它的工作原理应该如此。
答案 0 :(得分:0)
我想也许你对WHERE
声明有点过分了。它可能只是:
SELECT COUNT(create_user_id)::INT AS y,
x
FROM (
SELECT create_user_id,
create_time::abstime::DATE AS x
FROM table1 AS s
WHERE (
create_user_id = 16
AND TIMESTAMP 'epoch' + create_time * INTERVAL '1 second' BETWEEN '2015-03-09'
AND '2016-03-09'
)
OR (
update_user_id = 16
AND TIMESTAMP 'epoch' + update_time * INTERVAL '1 second' BETWEEN '2015-03-09'
AND '2016-03-09'
)
) AS res
GROUP BY x
ORDER BY x
似乎可以简化这一点,因为不需要子查询:
SELECT
COUNT(create_user_id)::INT AS y,
create_time::abstime::DATE AS x
FROM table1 AS s
WHERE (
create_user_id = 16
AND TIMESTAMP 'epoch' + create_time * INTERVAL '1 second' BETWEEN '2015-03-09'
AND '2016-03-09'
)
OR (
update_user_id = 16
AND TIMESTAMP 'epoch' + update_time * INTERVAL '1 second' BETWEEN '2015-03-09'
AND '2016-03-09'
)
GROUP BY x
ORDER BY x
但也许您的真实查询还有更多内容。