有没有办法限制表中每列值只有1行?

问题描述 投票:1回答:5

我正在过滤一些数据,其中table.x具有以下结构

column1 | c.2 |column3

0.0.0.0 | 20 | 2019-04-29 14:55:52
0.0.0.0 | 10 | 2019-04-29 14:45:52
0.0.0.0 | 50 | 2019-04-29 14:35:52
0.0.0.0 | 50 | 2019-04-29 14:25:52
0.0.0.0 | 90 | 2019-04-29 14:15:52
0.0.0.1 | 40 | 2019-04-29 14:05:52
0.0.0.1 | 40 | 2019-04-29 13:45:52
0.0.0.1 | 70 | 2019-04-29 13:30:52
0.0.0.4 | 20 | 2019-04-29 13:25:52

我希望结果集返回为

0.0.0.0 | 20 | 2019-04-29 14:55:52
0.0.0.1 | 40 | 2019-04-29 14:05:52
0.0.0.4 | 20 | 2019-04-29 13:25:52
sql postgresql
5个回答
1
投票

你需要通过分组获得每个column3的最大column1,然后加入到表中:

select t.*
from tablename t inner join (
  select column1, max(column3) column3
  from tablename
  group by column1
) g on g.column1 = t.column1 and g.column3 = t.column3

3
投票

如何将DISTINCT与一列一起使用如下:

SELECT DISTINCT ON (column1) column1, column2, column3 FROM table_name

注意c.2不是有效的列名。


这是一个在线演示https://rextester.com/FBIS74019


1
投票

您可以使用column1在max col3组上使用内连接

select * from my_table m
inner join  (
  select  column1, max(column3) col3
  from my_table 
  group by column1 
  ) t on t. column1 = m.column1 and t.col3 = m.column3 

1
投票

请尝试以下SQL代码:

SELECT max(column1), column2, max(column3)   --maximum of IP address and time
FROM yourTable
GROUP BY column1                             --grouped by IP address

结果是:

max(column1)  |  column2  |  max(column3)
------------------------------------------------
0.0.0.0          20          2019-04-29T14:55:52Z
0.0.0.1          40          2019-04-29T14:05:52Z
0.0.0.4          20          2019-04-29T13:25:52Z

0
投票

尝试使用窗口功能

select 
    column1, column2, column3
from (
    SELECT 
        column1, column2, column3,
        row_number() over ( partition by column1 ) pbg
    FROM tablename
) aaaa
where aaaa.pbg = 1
© www.soinside.com 2019 - 2024. All rights reserved.