Sql 博士后发现独特的价值观​;json格式

Sql 博士后发现独特的价值观​;json格式,sql,json,postgresql,greatest-n-per-group,Sql,Json,Postgresql,Greatest N Per Group,我使用的是Postgresql,有一个id为sender::jsonb和date的表,如下所示: id | sender | last login date ----+-------------------------------------------------------------------------

我使用的是Postgresql,有一个id为sender::jsonb和date的表,如下所示:

id |                                      sender                                        | last login date                 
----+-----------------------------------------------------------------------------------+----------------------------------
  1 | {"firstName": "Ivan",    "lastName": "Ivanov",       "middleName": "Ivanovich", } | 2021-04-10 14:49:36.234504 +00:00   
  2 | {"firstName": "Ivan",    "lastName": "Ivanov",       "middleName": "Ivanovich", } | 2021-04-09 14:49:36.234504 +00:00 
  3 | {"firstName": "Ivan",    "lastName": "Ivanov",       "middleName": "Ivanovich", } | 2021-04-11 14:49:36.234504 +00:00 
  4 | {"firstName": "Nickolai","lastName": "Nickov",       "middleName": "Nikovich", }  | 2021-04-30 14:49:36.234504 +00:00 
  5 | {"firstName": "Nickolai","lastName": "Nickov",       "middleName": "Nikovich", }  | 2021-04-29 14:49:36.234504 +00:00 
  6 | {"firstName": "Vladimir","lastName": "Vladimirovich","middleName": "Putout", }    | 2021-04-15 14:49:36.234504 +00:00 
  7 | {"firstName": "Petr",    "lastName": "Petrov",       "middleName": "Petrovich", } | 2021-04-10 14:49:36.234504 +00:00 
  8 | {"firstName": "Ivan",    "lastName": "Ivanov",       "middleName": "Ivanovich", } | 2021-04-01 14:49:36.234504 +00:00 
  9 | {"firstName": "Ignat",   "lastName": "Ignatov",      "middleName": "Ignatovich", }| 2021-04-06 14:49:36.234504 +00:00 
  10| {"firstName": "Vladimir","lastName": "Vladimirovich","middleName": "Putout", }    | 2021-04-17 14:49:36.234504 +00:00 
  11| {"firstName": "Ivan",    "lastName": "Ivanov",       "middleName": "Ivanovich", } | 2021-04-12 14:49:36.234504 +00:00 
p、 “发件人”栏中可能有其他信息,但只需通过“firstName”、“lastName”、“middlename”搜索唯一性

必须返回由唯一名称和最新日期组成的结果。特别是,我希望得到以下结果:

id |                                      sender                                        | last login date                 
----+-----------------------------------------------------------------------------------+----------------------------------
  4 | {"firstName": "Nickolai","lastName": "Nickov",       "middleName": "Nikovich", }  | 2021-04-30 14:49:36.234504 +00:00 
  10| {"firstName": "Vladimir","lastName": "Vladimirovich","middleName": "Putout", }    | 2021-04-17 14:49:36.234504 +00:00 
  11| {"firstName": "Ivan",    "lastName": "Ivanov",       "middleName": "Ivanovich", } | 2021-04-12 14:49:36.234504 +00:00 
  7 | {"firstName": "Petr",    "lastName": "Petrov",       "middleName": "Petrovich", } | 2021-04-10 14:49:36.234504 +00:00 
  9 | {"firstName": "Ignat",   "lastName": "Ignatov",      "middleName": "Ignatovich", }| 2021-04-06 14:49:36.234504 +00:00 

由于使用了json,一切都变得非常复杂。我曾想过要进行“命名”连接并执行分组和排序,但不幸的是,它不起作用。

您可以使用
distinct on()
来执行此操作:

select distinct on (firstname, lastname) id, sender, last_login_date
from (
   select id, sender, last_login_date, 
          sender ->> 'firstName' as firstname,
          sender ->> 'lastName' as lastname
   from the_table
) t
order by firstname, lastname, last_login_date desc

您可以使用窗口功能执行此操作:

select * from 
 ( 
  select * ,rank() over (partition by sender->> 'firstName',sender->> 'lastName' order by last_login_date desc) rn
  from yourtable
 ) t
where rn = 1
order by last_login_date desc

dbfiddle

“由于使用了json,一切都非常复杂。”——是的,的确如此。这就是为什么不应该使用JSON,而应该使用简单列或其他表,至少对于该名称数据,因为它们的模式似乎是固定的。提问并展示您已经尝试过的内容。解释失败的原因/原因。具体点(错误消息、意外结果等)。@stickybit你说得对。但不幸的是,在数据库中这种数据类型谢谢!但我有个问题。为什么,按照这个请求的例子,我有一个错误-语法错误在或接近“from”?@IlyaY:对我有用谢谢你的朋友。但是根据你的例子,我得到了错误的结果。@IlyaY除非你给了我们错误的期望输出,否则这就是你展示给我们的结果。请参阅anaswer中的dbfiddle