我有以下代码,当'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年为一个值搜索“一些字符串”对,但我不确定如何执行它。指出我正确的方向将不胜感激!苦苦寻找任何引用此文档的文档。谢谢!
答案 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
与使用聚合相比,这将为您提供相当长的,繁琐的代码。但我希望这是任务的重点 - 展示聚合的有用性。