[英]SQL DISTINCT EXISTS GROUP BY aggregate function
是否存在一个具有GROUP BY
聚合函数(例如DISTINCT EXISTS
的关系数据库,如果该组有多个不同的值,则返回TRUE,否则返回FALSE? 我正在寻找可以迭代组中的值直到当前值与先前值不同的东西,而不是对所有不同值进行计数。
Example:
pv_name | time_stamp | value
A | 1 | 1
B | 2 | 1
C | 3 | 1
A | 4 | 2
C | 5 | 2
B | 6 | 3
SELECT pv_name
FROM example
WHERE time_stamp > 0 AND time_stamp < 6
GROUP BY pv_name
HAVING DISTINCT_EXISTS(value);
Result: A, C
SELECT pv_name
FROM example
WHERE time_stamp > 0 AND time_stamp < 6
GROUP BY pv_name
HAVING MIN(value)<>MAX(value);
可能会根据索引使您更快到达那里。 我认为您不会比这或COUNT(DISTINCT value)
做得更好。
您是否尝试过两次加入示例? 伪代码示例:
with
(
SELECT pv_name
FROM example
WHERE time_stamp > 0 AND time_stamp < 6
) as Q
select distinct Q1.pv_name
from Q as Q1 inner join Q as Q2 on
Q1.pv_name=Q2.pv_name and
Q1.value<>q2.value
您可能知道COUNT(DISTINCT)函数,并且希望避免使用该函数以防止不必要的计算。
很难知道您为什么要寻找这个,但是我认为使用最明显的查询来找到这些组需要很长时间:
SELECT type, COUNT(DISTINCT product)
FROM aTable
GROUP BY type
HAVING COUNT(DISTINCT product) > 1
我可以建议您尝试使用窗口功能。 例如,尝试使用新的T-SQL的LAST_VALUE和FIRST_VALUE函数:
with c as (
SELECT type
,LAST_VALUE(product) OVER (PARTITION BY type ORDER BY product) lv
,FIRST_VALUE(product) OVER (PARTITION BY type ORDER BY product) pv
FROM aTable
)
SELECT * from c where lv <> pv
如果数据库引擎足够智能,它将找到该组的第一个/最后一个值,并且不会尝试对所有值进行计数,因此性能会更好。
对于MySQL,您可以使用帮助程序变量根据不同的值获取每个组的row_number,如下所示:
SELECT type, product
FROM (
SELECT @row_num := IF(@prev_type=type and @prev_prod=product,@row_num+1,1) AS RowNumber
,type
,product
,@prev_type := type
,@prev_prod := product
FROM Person,
(SELECT @row_num := 1) x,
(SELECT @prev_type := '') y,
(SELECT @prev_prod := '') z
ORDER BY type, product
) as a
WHERE RowNumber > 1
我认为在这里having min (value) <> max (value)
将是最有效的。 一种替代方法是:
Select distinct pv_name
From example e
Left join (
Select value
From example
Where ...
Group by value
Having count (*) = 1
) s on e.value = s.value
Where s.value is null
或者,您也可以针对该子查询使用NOT EXISTS。
在子查询中包括相关的where子句。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.