选择除SQL中的不同之处

时间:2017-03-22 14:25:03

标签: sql sql-server

我需要一些SQL查询的帮助。

想象一下,我有下表

id  | date       | price  
1   | 1999-01-01 | 10      
2   | 1999-01-01 | 10    
3   | 2000-02-02 | 15   
4   | 2011-03-03 | 15     
5   | 2011-04-04 | 16
6   | 2011-04-04 | 20
7   | 2017-08-15 | 20

我需要的是只有一个价格的所有日期。 在这个例子中,我需要摆脱第5行和第6行(因为同一日期有两个不同的价格)和1或2(因为它们是重复的)。

我该怎么做?

3 个答案:

答案 0 :(得分:2)

select date, 
       count(distinct price) as prices -- included to test
from MyTable
group by date
having count(distinct price) = 1 -- distinct for the duplicate pricing

答案 1 :(得分:1)

以下内容适用于任何DBMS

SELECT id, date, price
FROM   TheTable o
WHERE  NOT EXISTS (
         SELECT *
         FROM TheTable i
         WHERE i.date = o.date
           AND (
             i.price <> o.price
             OR (i.price = o.price AND i.id < o.id)
           ) 
        )
;

JohnHC的答案更具可读性,并提供OP要求的信息(“[...]我需要所有日期[...]”)。

我的回答虽然起初不太可读,但更为通用(允许更多复杂的打破平局标准),并且还能够返回整行(具有ID和价格,而不仅仅是日期)。

答案 2 :(得分:0)

;WITH CTE_1(ID ,DATE,PRICE)
AS
(
SELECT 1  , '1999-01-01',10      UNION ALL
SELECT 2  , '1999-01-01',10      UNION ALL
SELECT 3  , '2000-02-02',15      UNION ALL
SELECT 4  , '2011-03-03',15      UNION ALL
SELECT 5  , '2011-04-04',16      UNION ALL
SELECT 6  , '2011-04-04',20      UNION ALL
SELECT 7  , '2017-08-15',20     
)
,CTE2
AS
(
SELECT  A.* 
FROM CTE_1 A
INNER JOIN  
 CTE_1 B 
ON A.DATE=B.DATE AND A.PRICE!=B.PRICE
)
SELECT * FROM CTE_1 WHERE ID NOT IN (SELECT ID FROM CTE2)