(这是基于我之前提出的问题)我有一个名为users的表,其中包含用户ID,以及一些表,如{
"likes": 12,
"dislikes": 0
}
,cloud_storage_a
和cloud_storage_b
。如果用户存在于cloud_storage_a中,则表示它们已连接到云存储a。用户也可以存在于许多云存储中。这是一个例子:
cloud_storage_c
id | address | name | created_at
--------------------------------------------------
123 | 23 Oak Ave | Melissa | 2014-05-12
333 | 18 Robson Rd | Steve | 2015-01-20
421 | 95 Ottawa St | Helen | 2015-02-10
555 | 12 Highland | Amit | 2015-05-17
192 | 39 Anchor Rd | Oliver | 2015-08-25
cloud_storage_a
user_id | created_at
---------------------
421 | 2015-03-05
333 | 2015-02-01
cloud_storage_b
user_id | created_at
----------------------
555 | 2015-07-20
cloud_storage_c
我有一个查询来确定从注册时加入任何帐户的用户数量:
user_id | created_at
---------------------
192 | 2015-08-26
555 | 2015-08-01
但是从我的理解 - 这并没有抓住最低限度。 (即用户555,他们加入了云计算07-2015和云计算08-2015。我不认为我的查询现在计入最小日期 - 我将如何实现这一目标?
答案 0 :(得分:1)
好的,据我了解您所需的输出,您只需要将DISTINCT
添加到COUNT()
函数中,而且我认为如果执行逻辑会更具可读性(按两个方法计算)在子查询中的列,排序输出)和在更高级别查询中输出的格式。所以最后:
SELECT "Month" || '-' || "Year", "Count"
FROM (
SELECT
extract(MONTH from u.created_at) as "Month", extract(YEAR from u.created_at)) as "Year",
count(DISTINCT u.id) as "Count"
FROM users u
JOIN ( SELECT user_id, created_at FROM cloud_storage_a
UNION
SELECT user_id, created_at FROM cloud_storage_b
UNION
SELECT user_id, created_at FROM cloud_storage_c
) AS s1 ON s1.user_id = u.id
AND u.created_at <= s1.created_at
GROUP BY
EXTRACT(MONTH from u.created_at),
EXTRACT(YEAR from u.created_at)
ORDER BY
EXTRACT(YEAR from u.created_at),
EXTRACT(MONTH from u.created_at)
) sub
我还添加了日期检查以满足您的
要求...从注册时加入任何帐户......
答案 1 :(得分:0)
在您的表定义cloud_storage_a
后,我停止了阅读。
糟糕的桌面设计。您定义为表的内容应该是表中的一行。您不应继续使用此数据模型。
考虑这样的事情:
create table cloudstorages (
id serial not null primary key,
-- more attributes...
info text);
create table user_storage (
id serial not null primary key,
uid integer references users(id),
storage integer references cloudstorages(id)
);
然后回到这里使用新设计,如果它仍然无效。
编辑:刚看到你的日期格式。使用to_char()查看data type formatting。
编辑:你必须使用这些表,好吧......我会在结果集中创建年份和月份2列,这应该有助于分组。