【问题标题】:postgresql query to get counts between 12:00 and 12:00postgresql 查询以获取 12:00 到 12:00 之间的计数
【发布时间】:2017-08-08 18:10:45
【问题描述】:

我有以下查询可以正常工作,但它给了我一整天(00:00 到 23:59 UTC)的计数。例如,它为我提供了 2017 年 1 月 1 日(UTC 时间 00:00 至 23:59)的所有时间。

我的数据集适合在 UTC 时间 12:00 到 UTC 时间 12:00 之间进行查询。例如,我正在查找从 2017 年 1 月 1 日 12:00 UTC 到 2017 年 1 月 2 日 12:00 UTC 的所有计数。

这是我的查询:

SELECT count(DISTINCT ltg_data.lat), cwa, to_char(time, 'MM/DD/YYYY') 
FROM counties 
JOIN ltg_data on ST_contains(counties.the_geom, ltg_data.ltg_geom) 
WHERE cwa = 'MFR' 
  AND time BETWEEN '1987-06-01' 
  AND '1992-08-1' 
GROUP BY cwa, to_char(time, 'MM/DD/YYYY');

仅供参考...我正在更改时间格式,以便在 javascript 中更轻松地使用结果。

以及数据集的描述。每秒在各种多边形中出现数千个点数据。我正在确定这些点是否出现在多边形“cwa = MFR”中,然后对它们进行计数。

感谢您的帮助!

【问题讨论】:

    标签: sql postgresql postgis


    【解决方案1】:

    我在这里看到了两种方法。

    首先,join generate_series(start_date::timestamp,end_date,'12 hours'::interval) 算入那些generate_series。我相信这会更正确。但它有一个主要的缺点 - 你必须 lateral join 它针对现有数据集才能使用 min(time) 和 max(time)...

    其次,猴子自己破解,但编码和查询要少得多。使用不同的时区以 12:00 为一天的开始,例如(您没有提供样本,所以我以 generate_series 生成县的内容,间隔 2 小时作为样本数据):

    t=# with counties as (select generate_series('2017-09-01'::timestamptz,'2017-09-04'::timestamptz,'2 hours'::interval)
    g)
    select count(1),to_char(g,'MM/DD/YYYY') from counties
    group by to_char(g,'MM/DD/YYYY')
    order by 2;
     count |  to_char   
    -------+------------
        12 | 09/01/2017
        12 | 09/02/2017
        12 | 09/03/2017
         1 | 09/04/2017
    (4 rows)
    

    所以对于UTC 时区,由于我的示例中generate_series 的包容性,上述几天有 12 个两小时间隔行,最后几天有 1 行。一般:37 行。

    现在是猴子黑客:

    t=# with counties as (select generate_series('2017-09-01'::timestamptz,'2017-09-04'::timestamptz,'2 hours'::interval)
    g)
    select count(1),to_char(g at time zone 'utc+12','MM/DD/YYYY') from counties
    group by to_char(g at time zone 'utc+12','MM/DD/YYYY')
    order by 2;
     count |  to_char   
    -------+------------
         6 | 08/31/2017
        12 | 09/01/2017
        12 | 09/02/2017
         7 | 09/03/2017
    (4 rows)
    

    我为不同的时区选择相同的日期,准确地切换 12 小时,从 8 月 31 日中午开始,而不是 9 月 1 日午夜开始第一天,计数发生变化,仍然总计 37 行,但按您要求的方式分组......

    更新

    对于您的查询,我会尝试:

    SELECT count(DISTINCT ltg_data.lat), cwa, to_char(time at time zone 'utc+12', 'MM/DD/YYYY') 
    FROM counties 
    JOIN ltg_data on ST_contains(counties.the_geom, ltg_data.ltg_geom) 
    WHERE cwa = 'MFR' 
      AND time BETWEEN '1987-06-01' 
      AND '1992-08-1' 
    GROUP BY cwa, to_char(time at time zone 'utc+12', 'MM/DD/YYYY');
    

    如果您想将 +12 小时逻辑应用于 where 子句 - 也将 at time zone 'utc+12' 添加到“时间”比较中

    【讨论】:

    • 感谢您的快速回复。我正在遵循 hack 概念,但不遵循特定代码。我试图将其应用于查询,但它引发了“columncounties.the_geom 不存在”的错误。县为 (select generate_series('2016-06-01'::timestamptz, '2017-08-08'::timestamptz, '2 hours'::interval)g) SELECT count(DISTINCT ltg_data.lat), cwa, to_char(g at time zone 'utc+12', 'MM/DD/YYYY') FROM counties JOIN ltg_data on ST_contains(counties.the_geom, ltg_data.ltg_geom) WHERE cwa = 'MFR' GROUP by cwa, to_char(g at time zone 'utc + 12', 'MM/DD/YYYY' order by 2;
    • @user1610717 我用代码示例更新了 asnwer - 如果您遇到您提到的错误,请尝试
    • 它工作得非常好。非常感谢您的帮助!
    猜你喜欢
    • 1970-01-01
    • 2018-08-08
    • 2022-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-26
    相关资源
    最近更新 更多