2015-10-19 40 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