AVG只有效日期

时间:2015-03-31 19:27:59

标签: sql postgresql

我有一个像这样的简单搜索查询:

 SELECT COUNT(id),
        COUNT(CASE WHEN nation = 'german' THEN 1 END),
        COUNT(CASE WHEN nation = 'french' THEN 1 END),

        AVG(AGE(birthday))

 FROM persons;

我的问题是我收到了错误:

  ERROR: date out of range for timestamp

我想我收到了此错误,因为并非每个person都保存了birthday

birthdaydate-field

如何防止此错误,并且仅限有效日期的平均生日?谢谢

2 个答案:

答案 0 :(得分:1)

这个怎么样:

SELECT COUNT(id),
        COUNT(CASE WHEN nation = 'german' THEN 1 END),
        COUNT(CASE WHEN nation = 'french' THEN 1 END),

        AVG(AGE(COALESCE(birthday, 0) ))

 FROM persons where birthday is not null;

答案 1 :(得分:1)

我会使用另一个case语句从avg(age())计算中排除无效的空值:

SELECT 
  COUNT(id),
  COUNT(CASE WHEN nation = 'german' THEN 1 END),
  COUNT(CASE WHEN nation = 'french' THEN 1 END),
  AVG(CASE WHEN birthday IS NOT NULL THEN AGE(birthday) END)
FROM persons;

如果您要添加where birthday is not null子句,则平均值将是正确的(或尽可能正确),但由于排除的行未被计算,计数将会关闭。

请参阅此SQL Fiddle demo,并注意两个查询之间的计数差异。