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
这是一个有点复杂,我知道我应该考虑重新设计我的表。但这是我目前所拥有的,我应该处理它。
答
这里的诀窍是你想要失踪记录的日期。那么当数据不存在时,如何从数据库中选择数据?我们需要创建那些缺失的记录,以便数据库将它们作为值返回。
在下面的例子中,我们通过交叉连接到包含您想限制的日期的派生表(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;
**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
能否请你添加一些样本数据和期望的输出?这将有助于了解你正在尝试做什么。 –
向我们展示一些示例数据和期望结果 –
问题更新后,感谢您的帮助。 – PaxBin