2015-10-19 79 views
-1

我有這樣SQL SELECT組一列,並顯示最近的日期未找到

ID | DrugstoreName | date  | city  | zipcode 
1 | a1    | 2015-10-19 | paris 01 | 75001 
2 | a2    | 2015-10-23 | paris 02 | 75002 
3 | a3    | 2015-10-19 | paris 05 | 75005 
4 | a4    | 2015-10-24 | marseille | 13000 
5 | a5    | 2015-10-19 | nice  | 06000 
6 | a6    | 2015-10-23 | paris 09 | 75009 
7 | a7    | 2015-10-24 | paris 09 | 75009 
8 | a8    | 2015-10-24 | paris 03 | 75003 
9 | a9    | 2015-10-23 | paris 03 | 75003 
10 | a10   | 2015-10-19 | paris 04 | 75004 

表我所試圖做的是從我的表中選擇不同的(城市/郵政編碼),爲此,我至少有一個日期(date1,date2,date3)沒有任何匹配的記錄。

並且如果可能的話還顯示我們沒有記錄的最近日期。

例如我想選擇不同的(城市,郵政編碼,最近日期未找到)在哪裏日期不匹配至少一個(「2015-10-23」,「2015-10-24」 ); 結果應該是:

paris 01 | 75001 | 2015-10-23 
paris 02 | 75002 | 2015-10-24 
paris 05 | 75005 | 2015-10-23 
marseille | 13000 | 2015-10-23 
nice  | 06000 | 2015-10-23 
paris 04 | 75004 | 2015-10-23 

這是一個有點複雜,我知道我應該考慮重新設計我的表。但這是我目前所擁有的,我應該處理它。

+2

能否請你添加一些樣本數據和期望的輸出?這將有助於瞭解你正在嘗試做什麼。 –

+0

向我們展示一些示例數據和期望結果 –

+0

問題更新後,感謝您的幫助。 – PaxBin

回答

0

這裏的訣竅是你想要失蹤記錄的日期。那麼當數據不存在時,如何從數據庫中選擇數據?我們需要創建那些缺失的記錄,以便數據庫將它們作爲值返回。

在下面的例子中,我們通過交叉連接到包含您想限制的日期的派生表(Y)來做到這一點。這也可以通過使用SELECT Distinct date from Foo where date in ('2015-10-23','2015-10-24')假設記錄存在這些日期來完成。然後,通過使用集合函數,截然不同的日期和具有子句,我們可以生成所需的結果。

外連接不起作用。它不會生成每個城市/拉鍊只有空記錄的日期。所以這成爲了解交叉連接以及爲什麼笛卡爾產品可以提供幫助的好時機。

我用group_concat顯示所有缺少的日期和記錄日期。我這樣做,所以你可以看到爲什麼min(Y.date)返回最低日期。

SELECT A.city, A.zipcode, min(Y.date) as Date, 
group_Concat(Y.Date) as AllMissingDates, 
group_Concat(A.Date) as RecordDates 
FROM foo A 
CROSS JOIN 
(SELECT '2015-10-23' date UNION ALL SELECT '2015-10-24') Y 
WHERE A.Date <> Y.date 
GROUP BY City, ZipCode 
Having count(Distinct A.Date) < 2; 

SQL FIDDLE

**city  zipCode Date  AllMissingDates RecordDates** 
marseille 13000 2015-10-23 2015-10-23  2015-10-24 
nice  6000 2015-10-23 2015-10-24,  2015-10-19, 
           2015-10-23  2015-10-19 
paris 01 75001 2015-10-23 2015-10-23,  2015-10-19, 
           2015-10-24  2015-10-19 
paris 02 75002 2015-10-24 2015-10-24  2015-10-23 
paris 04 75004 2015-10-23 2015-10-24,  2015-10-19, 
           2015-10-23  2015-10-19 
paris 05 75005 2015-10-23 2015-10-23,  2015-10-19, 
           2015-10-24  2015-10-19 
+0

謝謝,但在這種情況下,您在(「2015-10-23」,「2015-10-24」)中使用了日期,而我需要的是其中某個日期沒有記錄的城市。 – PaxBin

+0

寫了一個小提示幫助我理解正確的語法。 – xQbert

+0

你真了不起,非常感謝,像一個魅力 – PaxBin