从表中选择值时避免聚合

时间:2018-04-01 03:11:32

标签: sql postgresql

我有以下代码,当'some string'在1990年出现多次时,从table2中选择值

SELECT a.value, COUNT(*) AS test 
FROM table1 c
JOIN table2 a 
  ON c.value2 = a.value_2 
JOIN table3 o
  ON c.value3 = o.value_3 
  AND o.value4 = 1990 
WHERE c.string = 'Some string' 
GROUP BY a.value 
HAVING COUNT(*) > 1

这很好但我试图编写一个不使用聚合产生类似结果的查询。我只需要选择多于1个c.string的值并选择那些而不是计数并选择计数。我想在1990年为一个值搜索“一些字符串”对,但我不确定如何执行它。指出我正确的方向将不胜感激!苦苦寻找任何引用此文档的文档。谢谢!

2 个答案:

答案 0 :(得分:1)

使用窗口函数ROW_NUMBER()在每个table2.value的行中分配序列号。并使用窗口函数FIRST_VALUE()来获取每个table2.value的最大行号。使用DISTINCT删除重复项:

select distinct value, first_value(rn) over (  order by rn desc) as count
from
(
SELECT  a.value , row_number() over (partition by a.value order by null) rn
FROM table1 c
JOIN table2 a 
  ON c.value2 = a.value_2 
JOIN table3 o
  ON c.value3 = o.value_3 
  AND o.value4 = 1990 
WHERE c.string = 'Some string'  ) t
where rn > 1;

答案 1 :(得分:-1)

要检查重复项,可以使用“WHERE EXISTS”作为起点。你可以先阅读:

https://www.w3schools.com/sql/sql_exists.asp

与使用聚合相比,这将为您提供相当长的,繁琐的代码。但我希望这是任务的重点 - 展示聚合的有用性。