你如何在postgres中显示每个类别的最大日期
How do you display the max date per category with conditions in postgres
如果我有一个像这样的 table(我们称它为 t_info):
surname
date_of_birth
blue_eyes
blonde_hair
right_handed
Smith
2013-06-13
True
True
True
Smith
2014-08-20
True
False
True
Brown
2012-07-27
True
True
False
Brown
2013-01-30
True
False
True
Brown
2014-12-15
True
True
False
Hughes
2014-07-08
True
True
False
我非常想要一种方法来了解具有特定条件的每个姓氏的最大出生日期。
如果我可以 return 这个就好了:
surname
blue_eyes
blonde_hair
right_handed
Smith
2014-08-20
2013-06-13
2014-08-20
Brown
2014-12-15
2014-12-15
2013-01-30
Hughes
2014-07-08
2014-07-08
Null
我绝对可以通过执行以下操作来分别获得每样东西:
select surname, max(date_of_birth) as blue_eyes
from t_info
where blue_eyes
group by surname;
我可以将每一列作为子查询执行此操作,然后在姓氏上将它们连接在一起,但似乎必须有更好的方法使用某种 window 函数或类似函数,我就是做不到想想它是如何工作的。
如果联合子查询是正确的方法,那就这样吧。
请注意我的实际数据不是这个,但它在类别、日期和一些布尔字段方面具有相同的结构。
我使用的是 10.5 版的 postgres。
SELECT
surname
, MAX(CASE WHEN blue_eyes THEN date_of_birth END) AS blue_eyes
, MAX(CASE WHEN blonde_hair THEN date_of_birth END) AS blonde_hair
, MAX(CASE WHEN right_handed THEN date_of_birth END) AS right_handed
FROM
t_info
GROUP BY surname
如果我有一个像这样的 table(我们称它为 t_info):
surname | date_of_birth | blue_eyes | blonde_hair | right_handed |
---|---|---|---|---|
Smith | 2013-06-13 | True | True | True |
Smith | 2014-08-20 | True | False | True |
Brown | 2012-07-27 | True | True | False |
Brown | 2013-01-30 | True | False | True |
Brown | 2014-12-15 | True | True | False |
Hughes | 2014-07-08 | True | True | False |
我非常想要一种方法来了解具有特定条件的每个姓氏的最大出生日期。 如果我可以 return 这个就好了:
surname | blue_eyes | blonde_hair | right_handed |
---|---|---|---|
Smith | 2014-08-20 | 2013-06-13 | 2014-08-20 |
Brown | 2014-12-15 | 2014-12-15 | 2013-01-30 |
Hughes | 2014-07-08 | 2014-07-08 | Null |
我绝对可以通过执行以下操作来分别获得每样东西:
select surname, max(date_of_birth) as blue_eyes
from t_info
where blue_eyes
group by surname;
我可以将每一列作为子查询执行此操作,然后在姓氏上将它们连接在一起,但似乎必须有更好的方法使用某种 window 函数或类似函数,我就是做不到想想它是如何工作的。 如果联合子查询是正确的方法,那就这样吧。 请注意我的实际数据不是这个,但它在类别、日期和一些布尔字段方面具有相同的结构。
我使用的是 10.5 版的 postgres。
SELECT
surname
, MAX(CASE WHEN blue_eyes THEN date_of_birth END) AS blue_eyes
, MAX(CASE WHEN blonde_hair THEN date_of_birth END) AS blonde_hair
, MAX(CASE WHEN right_handed THEN date_of_birth END) AS right_handed
FROM
t_info
GROUP BY surname