2011-12-29 69 views
3

T-SQL中用於選擇受HAVING屬性限制的原始值的方法是什麼?舉例來說,如果我有如何獲取通過HAVING條件過濾的原始行?

A|B 
10|1 
11|2 
10|3 

我怎麼才能到B(不是平均值或其他一些彙總統計),通過分組的所有值,號數(A的出現)小於或相等的兩個較大2?

回答

3

其實,你有幾個選項可供選擇

1.你可以做一個子查詢你的原有聲明,並加入回你的表

SELECT * 
FROM YourTable yt 
     INNER JOIN (
     SELECT A 
     FROM YourTable 
     GROUP BY 
       A 
     HAVING COUNT(*) >= 2 
     ) cnt ON cnt.A = yt.A 

2.另一等效解決方案將使用WITH子句

;WITH cnt AS (
    SELECT A 
    FROM YourTable 
    GROUP BY 
      A 
    HAVING COUNT(*) >= 2 
) 
     SELECT * 
     FROM YourTable yt 
      INNER JOIN cnt ON cnt.A = yt.A 

3.或者你可以使用一個報表

 SELECT * 
     FROM YourTable yt 
     WHERE A IN (SELECT A FROM YourTable GROUP BY A HAVING COUNT(*) >= 2) 
+0

似乎我想我會想要的,但我忽略了在我的情況下,A將是一個函數的結果(即DATEDIFF)。所以不知道如何加入一個函數? – 2011-12-29 23:53:08

+0

@KyleBrandt - 如果你提供一些樣本數據和預期結果,我相信有可能想出一些東西。 – 2011-12-30 00:31:44

2

自連接將工作:

select B 
from table 
join(
    select A 
    from table 
    group by 1 
    having count(1)>1 
)s 
using(A); 
+0

我從來沒有見過這種語法(但這並不意味着什麼)。你確定這是有效的SQL嗎?你有任何參考? – 2011-12-29 23:33:14

+0

@Lieven - 我沒有一個MS-SQL的版本,但這是PostgreSQL中的有效語法。無論如何,將這種簡單查詢的語法從一種SQL方言轉換爲另一種方言是一件小事。 – 2011-12-29 23:34:17

+1

SQL Server中不支持'USING'和'GROUP BY(ordinal)'。後者是不好的做法無論如何 – gbn 2011-12-30 05:44:20

1

您可以使用窗口函數(無連接,只有一個表掃描):

select * from (
    select *, cnt=count(*) over(partiton by A) from table 
) as a 
where cnt >= 2