如何获取按日期分组的最小日期?

时间:2015-10-21 17:15:06

标签: postgresql aggregate-functions postgresql-9.3

(这是基于我之前提出的问题)我有一个名为users的表,其中包含用户ID,以及一些表,如{ "likes": 12, "dislikes": 0 }cloud_storage_acloud_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。我不认为我的查询现在计入最小日期 - 我将如何实现这一目标?

2 个答案:

答案 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列,这应该有助于分组。