2017-03-22 39 views
1

我需要一些幫助來處理SQL查詢。選擇除了在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(因爲它們是重複的)。

我該怎麼做?

+1

SQL Server 2005中 - 我以爲標籤就足夠了... – BlueEel

+2

我感到困惑您的要求。他們有點矛盾。你說你只想要那些有單一價格的行,所以你想要消除第5行和第6行。但是,你還要聲明你想要返回行1或行2。這是什麼? –

回答

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答案是更具可讀性和可提供的任擇議定書要求的信息(「[...]我需要所有的日期[...]」) 。

我的回答雖然起初不太明朗,但更爲一般(允許更復雜的打破標準),並且能夠返回整行(帶有ID和價格,而不僅僅是日期)。

+0

這返回行1,3,4,6和7 - 我需要的是1,3,4和7 – BlueEel

+1

@BlueEel你是對的;我糾正了這個錯字:是'i.price> o.price',但正確的是'i.price <> o.price'。 Thansk注意到它。 – rslemos

+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 
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) 
+0

這將返回行1,2,3,4,6和7 - 不完全是我所要求的。 – BlueEel

+0

@BlueEel您好,我剛剛更改了代碼,它給出了預期的結果並消除了5,6 – 2017-03-26 12:00:55