Sql 返回基于不同日期的多列计数结果

Sql 返回基于不同日期的多列计数结果,sql,postgresql,Sql,Postgresql,我有一张有很多数据的表。我想根据48小时内和30天内收到的数据提取不同的结果计数进行比较 Fog||Count48hr(fog)||Count30day(fog)||Snow||Count48hr(snow)||Count30day(snow) LA01 1123 3000 NWC 54 109 SIU 3665 7000 SIS 21

我有一张有很多数据的表。我想根据48小时内和30天内收到的数据提取不同的结果计数进行比较

Fog||Count48hr(fog)||Count30day(fog)||Snow||Count48hr(snow)||Count30day(snow)
LA01    1123            3000           NWC        54               109
SIU     3665            7000           SIS        21                64
CHARTN  444             1500           PHS        39                120

注意:这些计数中的每一个都是48小时或30天内发生的计数

如果您愿意通过两个单独的查询来实现这一点,一个是雾,一个是雪,您可以对数据执行条件求和,仅当到达时间满足所需标准时才增加计数

-- Fog
SELECT
  fog,
  SUM(CASE WHEN NOW() - arrival_time < INTERVAL '48 HOURS' THEN 1 ELSE 0 END)
    AS count48hr_fog,
  SUM(CASE WHEN NOW() - arrival_time BETWEEN INTERVAL '48 HOURS' AND
    INTERVAL '30 DAYS' THEN 1 ELSE 0 END) AS count30day_fog
FROM your_table
GROUP BY fog;
然后,您可以再次执行相同的操作,将雾列替换为雪列,并可能重命名输出列

这假设在您的计数中,您是在独立地查看雪和雾-例如,如果出于某种原因,您实际上在计算过去48小时内LA01与NWC一起发生的雪和雾类型配对次数,则您可以使用此查询进行合并:

SELECT
  fog,
  snow,
  SUM(CASE WHEN NOW() - arrival_time < INTERVAL '48 HOURS' THEN 1 ELSE 0 END)
    AS count48hr,
  SUM(CASE WHEN NOW() - arrival_time BETWEEN INTERVAL '48 HOURS' AND
    INTERVAL '30 DAYS' THEN 1 ELSE 0 END) AS count30day
FROM your_table
GROUP BY fog, snow;

然而,您发布的内容意味着这不是您想要的-我已经将其包括在内,以防出现您需要的用例。

如果您提供示例表,这将更容易回答。我们不知道您的输入数据是如何构造的。此外,我不清楚雾和雪列代表什么-它们看起来像位置,但LA01如何/为什么与NWC配对,SIU与SIS配对,CHARIN与PHS配对?抱歉混淆。这个表有很多列,但我感兴趣的是雾、雪和到达时间。LA01、SIU和CHARTN是一种雾,而NWC、SIS和PHS是另一种雪。到达时间是记录的时间。因此,我需要计算48小时内以及过去30天内发生LA01的次数。其他人也是这样。希望它现在更有意义。@您发布的表是您已有的数据,还是您希望作为输出得到的数据的表示?我这样问是因为我在你发布的表格中没有看到到达时间列。我们可以假设它是一个TIMESTAMP类型的列或类似的列吗?它表示我想要得到的是的,它有一个用于到达时间的列。我在表中使用的列是雾、雪和到达时间。我知道这是如何回答你的问题的@rchang