我正在尝试8weeksqlchallenge,我通常使用MySQL,错误代码在那里相当干净,但在dbfiddle.com上没有那么多
这是我的模式
CREATE SCHEMA dannys_diner;
SET search_path = dannys_diner;
CREATE TABLE sales
(
"customer_id" VARCHAR(1),
"order_date" DATE,
"product_id" INTEGER
);
INSERT INTO sales ("customer_id", "order_date", "product_id")
VALUES
('A', '2021-01-01', '1'),
('A', '2021-01-01', '2'),
('A', '2021-01-07', '2'),
('A', '2021-01-10', '3'),
('A', '2021-01-11', '3'),
('A', '2021-01-11', '3'),
('B', '2021-01-01', '2'),
('B', '2021-01-02', '2'),
('B', '2021-01-04', '1'),
('B', '2021-01-11', '1'),
('B', '2021-01-16', '3'),
('B', '2021-02-01', '3'),
('C', '2021-01-01', '3'),
('C', '2021-01-01', '3'),
('C', '2021-01-07', '3');
CREATE TABLE menu
(
"product_id" INTEGER,
"product_name" VARCHAR(5),
"price" INTEGER
);
INSERT INTO menu ("product_id", "product_name", "price")
VALUES
('1', 'sushi', '10'),
('2', 'curry', '15'),
('3', 'ramen', '12');
CREATE TABLE members
(
"customer_id" VARCHAR(1),
"join_date" DATE
);
INSERT INTO members ("customer_id", "join_date")
VALUES
('A', '2021-01-07'),
('B', '2021-01-09');
而ask是查找每个客户购买的第一个产品,所以我想使用以下代码进行子查询,但它返回
查询错误:错误:语法错误在或附近“SELECT”
SELECT sales.customer_id, sales.product_id
FROM dannys_diner.sales
WHERE sales.order_date = SELECT MIN(sales.order_date)
FROM dannys_diner.sales
GROUP BY sales.customer_id;
3条答案
按热度按时间6ie5vjzr1#
这里有两个语法错误。
首先,子查询需要括在括号中。这很容易补救。
其次,为了在与
sales.order_date
的相等比较的右侧有效,子查询 * 必须 * 保证总是返回单个值。子查询中的GROUP BY
子句打破了这一点,因为它允许为每个客户id设置单独的最小订单日期。这一点比较难解决,因为这意味着要重新考虑查询的结构。相反,我建议使用
row_number()
窗口函数来按日期标识行,然后显示行中的产品,而不需要相关的每行子查询或JOIN(换句话说,它应该快**多 *):https://dbfiddle.uk/YGdol5Rd
vwoqyblh2#
你可以加入这个小组,得到你想要的结果。
| 客户ID|产品ID|
| --|--|
| 一| 1 |
| 一| 2 |
| B| 2 |
| C| 3 |
| C| 3 |
fiddle
nc1teljy3#
您需要在子查询周围使用
(
和)
,如下所示正如一些人所指出的,可能会有数据导致问题,连接解决了这个问题,因为您可以确保最小值是由customer_id确定的,就像这样
注意如果你用我的代码比较小提琴
https://dbfiddle.uk/CSKDTxd6
对于Joel的回答(使用窗口函数),您可以看到我们得到了不同的结果-如果它们具有相同的日期,我将返回多行-他将只返回一行。选择哪一个符合您的要求: