sql - SQLite GROUP BY 最低价格缺失结果
问题描述
我有一个 SQLite 数据库,它基本上包含产品和价格列表。
CREATE TABLE brand_list (
id INTEGER NOT NULL,
brand_name TEXT NOT NULL,
PRIMARY KEY (id)
);
CREATE TABLE product_list (
id INTEGER NOT NULL,
prod_generic VARCHAR NOT NULL,
prod_pretty VARCHAR NOT NULL,
PRIMARY KEY (id),
UNIQUE (prod_generic)
);
CREATE TABLE qty_list (
id INTEGER NOT NULL,
qty_initial VARCHAR NOT NULL,
PRIMARY KEY (id)
);
CREATE TABLE vendor_list (
id INTEGER NOT NULL,
vendor_name TEXT NOT NULL,
vendor_url VARCHAR NOT NULL, url_pretty varchar not null default 1, datacollect varchar not null default 'Y',
PRIMARY KEY (id)
);
CREATE TABLE listing (
id INTEGER NOT NULL,
brand_id INTEGER,
qty_id INTEGER,
vendor_id INTEGER,
prod_id INTEGER,
qty_actual INTEGER,
price INTEGER,
unit_price FLOAT,
timestamp VARCHAR(255),
sale INTEGER DEFAULT 0 NOT NULL,
PRIMARY KEY (id),
FOREIGN KEY(brand_id) REFERENCES brand_list (id),
FOREIGN KEY(prod_id) REFERENCES product_list (id),
FOREIGN KEY(qty_id) REFERENCES qty_list (id),
FOREIGN KEY(vendor_id) REFERENCES vendor_list (id)
我拉了一个查询,查看列表,目的是获取最低价格并列出最终用户的所有相关信息(即品牌、产品、数量、价格、何时拉出、从何处拉出)。
select qty_initial, qty_actual, price, MIN(unit_price), brand_name, prod_pretty, sale, timestamp, vendor_name from listing left join brand_list on listing.brand_id = brand_list.id left join product_list on listing.prod_id = product_list.id left join vendor_list on listing.vendor_id = vendor_list.id left join qty_list on listing.qty_id = qty_list.id group by prod_pretty order by brand_name, prod_pretty
我看到的是大部分数据都显示了,但并非所有数据都显示了。它似乎并不一致——但一个品牌可能会展示八分之七的参赛作品,另一个品牌可能拥有一切。
有趣的是,如果我在 group by 之前添加一个 WHERE 子句并指定一个我知道原始输出中缺少条目的品牌,我将获得该品牌的所有预期输出。
这不是我的世界——我只是为了自己的乐趣而拼凑一些东西。我敢肯定我在这里遗漏了一些基本的东西,它很可能围绕着 GROUP BY。任何方向都会很棒——甚至是一种重新思考我如何以更简单的方式到达我想去的地方的方法。
解决方案
您的查询格式错误——尽管 SQLite 确实接受它。列GROUP BY
与SELECT
列表不一致。
相反,使用窗口函数:
select qty_initial, qty_actual, price, unit_price, brand_name, prod_pretty, sale, timestamp, vendor_name
from (select qty_initial, qty_actual, price, unit_price, brand_name, prod_pretty, sale, timestamp, vendor_name,
row_number() over (partition by prod_pretty order by unit_price) as seqnum
from listing left join
brand_list
on listing.brand_id = brand_list.id left join
product_list
on listing.prod_id = product_list.id left join
vendor_list
on listing.vendor_id = vendor_list.id left join
qty_list
on listing.qty_id = qty_list.id
group by prod_pretty
) p
where seqnum = 1
order by brand_name, prod_pretty
推荐阅读
- python-3.x - 这种快速排序算法的实现有什么问题?错误是 RecursionError
- mysql - 如何MYSQL比较来自同一列的值
- javascript - 如何使用json中的键删除空值
- c# - 如何使用 request.xml 文件在 C# windows 应用程序中使用soap请求
- php - 从键和级别创建多维数组
- python - Selenium 中是否有任何 API 可以从 chrome 扩展中收集错误?
- perl - 在 Perl 中解析多个文件
- html - 当用户“离开”它而不输入任何内容时,角度会改变文本字段的颜色
- ios - 定期在后台发送 api 请求并接收结果作为通知
- java - 检查字符串是否仅包含 Unicode 值 [\u0030-\u0039] 或 [\u0660-\u0669]