我有下表:
AMAZON_ID | DATE | STATUS
1 | 01/03/2014 | Pending
1 | 01/03/2014 | Shipped
2 | 01/04/2014 | Pending
3 | 01/05/2014 | Cancelled
4 | 01/06/2014 | Pending
如何从表中选择最早的日期,其中状态等于挂起,其中id的计数不超过1,它应该如下所示:
AMAZON_ID | DATE | STATUS
2 | 01/04/2014 | Pending
我无法弄明白,这是我迄今为止所做的,但它不起作用:
SELECT date
FROM table
WHERE status = 'Pending'
AND COUNT(id) < 2
ORDER BY date ASC
LIMIT 1;
答案 0 :(得分:4)
使用子查询GROUP BY
id
个COUNT
的{{1}}。确保您的ID是IN
此子查询的结果,status
等待的1}}然后ORDER BY
日期和LIMIT
到第一个结果。
SELECT date
FROM table
WHERE
status = 'Pending' AND
id IN (
SELECT id
FROM table
GROUP BY id
HAVING COUNT(*) = 1
)
ORDER BY date ASC
LIMIT 1;
答案 1 :(得分:0)
您可以做的一件事是使用WHERE IN,并使用select语句用不同的ID填充WHERE子句
SELECT date
FROM table
WHERE status = 'Pending'
AND id IN (SELECT DISTINCT id FROM table)
ORDER BY date ASC
LIMIT 1;
答案 2 :(得分:0)
这取决于你的真实含义“id的数量不超过一个”。
我已将列 date 重命名为 ts 以使查询成为有效的SQL(因为DATE是一个SQL函数,因此可能会混淆解析器)。请参阅SQL fiddle for the complete schema I used and the example queries。
在这种情况下,您遇到了问题,因为您希望查询获取基于同一表的不同信息的一条信息(最小日期)。这意味着您需要查询,幸运的是,您可以加入两个查询的数据并进行适当的过滤。
SELECT data.id, status, MIN(ts)
FROM data
JOIN (SELECT id, COUNT(*) AS amount FROM data GROUP BY id) AS totals
ON totals.id = data.id
WHERE
status = "Pending"
AND totals.amount < 2
GROUP BY data.status;
注意:这个答案没有回答OP的问题
<击> 在这种情况下,情况非常简单,因为您可以使用状态“pending”过滤所有行,最小日期和与您的结果匹配的行总数,以及在汇总后(即:使用 HAVING )过滤金额少于2的那些。
在SQL中将是:
SELECT id, status, MIN(ts) AS minTS, COUNT(*) AS amount
FROM data
WHERE
status = "Pending"
GROUP BY id, status
HAVING amount < 2
击> <击> 撞击>