假设这样的数据库:
Date | Attribute1 | Attribute2 | ... | AttributeN
-------------------------------------------------
1 | A | C | ... | ...
1 | B | C | ... | ...
2 | A | A | ... | ...
2 | B | B | ... | ...
2 | A | A | ... | ...
3 | B | B | ... | ...
3 | A | A | ... | ...
4 | B | C | ... | ...
4 | A | A | ... | ...
我正在尝试找出哪些唯一日期(它们在实际案例中是实际的date
但我认为不重要),{{1>所有元素{{1} }等于Attribute1
中的对应元素。上面的示例数据的结果将是
Attribute2
因为对于Date
----
2
3
等于date
的每条记录(2
都相同),3
等于Attribute1
。不会返回Attribute2
,因为虽然示例中的最后一条记录符合标准(因为4
等于A
),但第二条最后一条记录却没有(因为A
没有等于B
)。
我无法弄清楚如何编写此查询,我希望有一些聚合函数(在下面的代码中显示为C
),这将允许我编写类似的内容:
ALL(...)
有这样的功能吗?否则,使用SELECT Date
FROM myTable
GROUP BY Date
HAVING ALL(Attribute1 = Attribute2)
可能有一种聪明的方法吗?
答案 0 :(得分:4)
您可以使用HAVING
和CASE
:
SELECT [Date]
FROM #tab
GROUP BY [Date]
HAVING SUM(CASE WHEN Attribute1 = Attribute2 THEN 0 ELSE 1 END) = 0
的 LiveDemo
强>
否则有一种聪明的方法可以使用COUNT吗?
为什么不:)带COUNT
的版本:
SELECT [Date]
FROM #tab
GROUP BY [Date]
HAVING COUNT(CASE WHEN Attribute1 <> Attribute2 THEN 1 END) = 0
的 LiveDemo2
强>
答案 1 :(得分:3)
也许这就是:
select Date from Test
Except
Select Date from Test where Attribute1 <> Attribute2
答案 2 :(得分:1)
如果你扭转它,逻辑会更容易。您需要所有唯一的DATE
值,其中不是 Attribute1
与Attribute2
不同的行:
SELECT DISTINCT [Date] FROM myTable
WHERE [Date] NOT IN (
SELECT [Date] FROM myTable
WHERE Attribute1 != Attribute2)