T-SQL中用於選擇受HAVING屬性限制的原始值的方法是什麼?舉例來說,如果我有如何獲取通過HAVING條件過濾的原始行?
A|B
10|1
11|2
10|3
我怎麼才能到B(不是平均值或其他一些彙總統計),通過分組的所有值,號數(A的出現)小於或相等的兩個較大2?
T-SQL中用於選擇受HAVING屬性限制的原始值的方法是什麼?舉例來說,如果我有如何獲取通過HAVING條件過濾的原始行?
A|B
10|1
11|2
10|3
我怎麼才能到B(不是平均值或其他一些彙總統計),通過分組的所有值,號數(A的出現)小於或相等的兩個較大2?
其實,你有幾個選項可供選擇
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)
自連接將工作:
select B
from table
join(
select A
from table
group by 1
having count(1)>1
)s
using(A);
我從來沒有見過這種語法(但這並不意味着什麼)。你確定這是有效的SQL嗎?你有任何參考? – 2011-12-29 23:33:14
@Lieven - 我沒有一個MS-SQL的版本,但這是PostgreSQL中的有效語法。無論如何,將這種簡單查詢的語法從一種SQL方言轉換爲另一種方言是一件小事。 – 2011-12-29 23:34:17
SQL Server中不支持'USING'和'GROUP BY(ordinal)'。後者是不好的做法無論如何 – gbn 2011-12-30 05:44:20
您可以使用窗口函數(無連接,只有一個表掃描):
select * from (
select *, cnt=count(*) over(partiton by A) from table
) as a
where cnt >= 2
似乎我想我會想要的,但我忽略了在我的情況下,A將是一個函數的結果(即DATEDIFF)。所以不知道如何加入一個函數? – 2011-12-29 23:53:08
@KyleBrandt - 如果你提供一些樣本數據和預期結果,我相信有可能想出一些東西。 – 2011-12-30 00:31:44