如何统计SQL中所有组合出现的次数?
是否有任何选项可以在不使用临时表或过程的情况下获得一个 SQL 查询中所有元素的计数组合?
考虑以下三个表:
products (id, Product_name)
transactions (id, date)
transaction_has_product (id, Product_id, transaction_id)
示例数据
产品
<前><代码>1 AAA 2 血脑屏障 3CCC交易
<前><代码>1 some_date 2 某个日期transaction_has_products
<前><代码>1 1 1 2 2 1 3 3 1 4 1 2 5 2 2
结果应该是:
AAA, BBB = 2
AAA, CCC = 1
BBB, CCC = 1
AAA, BBB, CCC = 1
Is there any option to gain counted combinations of all elements in one SQL query, without using temp tables or procedures?
Consider these three tables:
products (id, product_name)
transactions (id, date)
transaction_has_product (id, product_id, transaction_id)
Sample data
products
1 AAA 2 BBB 3 CCC
transactions
1 some_date 2 some_date
transaction_has_products
1 1 1 2 2 1 3 3 1 4 1 2 5 2 2
Result should be:
AAA, BBB = 2
AAA, CCC = 1
BBB, CCC = 1
AAA, BBB, CCC = 1
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
这并不容易,因为与其他行相比,最后一行中的匹配产品数量不同。您也许可以使用某种 GROUP_CONCAT() 运算符(在 MySQL 中可用;可在其他 DBMS 中实现,例如 Informix 和可能的 PostgreSQL)来完成此操作,但我对此没有信心。
成对匹配
处理三重匹配并非易事;进一步扩展它肯定是相当困难的。
Not easily because you have different numbers of matched products in the last row compared with the other rows. You might be able to do it with some sort of GROUP_CONCAT() operator (available in MySQL; implementable in other DBMS, such as Informix and probably PostgreSQL), but I'm not confident of that.
Pairwise Matching
Handling the triple match is non-trivial; extending it further than that is definitely rather difficult.
如果您预先知道所有产品是什么,您可以通过像这样旋转数据来做到这一点。
如果您事先不知道产品是什么,您可以在存储过程中动态构建此查询。如果产品数量很大,这两种方法的实用性都会崩溃,但我认为无论如何实现这一要求,这都可能是正确的。
结果:
If you know what all the products will be up front, you could do it by pivoting the data like this.
If you don't know what the products will be up front, you could build this query dynamically in a stored procedure. The practicality of either approach would break down if the number of products is large, but I think that would probably be true no matter how this requirement is accomplished.
Result:
根据您对查询的控制程度(对于 postgresql,TSQL 可能需要更改)
,其中
(1,2,3)
是您要检查的 ID 列表,= 3
等于列表中的条目数量。Depending on how much control you have on the query you could do (this is TSQL might have to change for postgresql)
where
(1,2,3)
is the list of ID's you want to check for and the= 3
equals the amount of entries in the list.经过上述步骤后,您可能会得到类似的结果:
您可以加入您的products 表来用产品名称替换产品 id - 但我想你会从这里得到它。
这是小提琴(sqlfiddle 今天过得很糟糕 - 所以请在您的db,以防它抛出一些奇怪的错误,例如超时或类似的错误)
GL,HF:D
After above steps, you could get something like:
You can join your products table to replace product ids with their names - but I gues you'll get it from here.
here's the fiddle (sqlfiddle is having a bad day today - so check this out on your db in case it throws some weird error like timeout or something like that)
GL, HF :D