簡體   English   中英

SQL DISTINCT EXISTS GROUP BY聚合函數

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM