为每个组调用一个 SQL 过程

数据挖掘 sql
2022-02-25 06:08:53

我正在尝试为每组数据调用一个过程。例如,我有一个客户列表和他们喜欢的电影功能。是一对多的关系,我在数据集中有一个特定客户的许多记录。因此,我要做的是为每个特定客户应用聚类算法。需要一些关于我应该在 SQL 上应用什么语句的帮助。

先感谢您!

1个回答

我不确定我是否得到您的问题,但没有足够的声誉发表评论。因此,我将做出一些假设,并根据我的理解做出最好的回答。

例如使用 SQLite(这是不同方言中最简单的变体之一),让我们假设您的数据是通过以下方式创建的:

CREATE TABLE "Customer" (
  id INTEGER NOT NULL, 
  name VARCHAR(64) NOT NULL, 
  PRIMARY KEY (id), 
  UNIQUE (id)
);

CREATE TABLE "Movie" (
  id INTEGER NOT NULL, 
  customer INTEGER NOT NULL, 
  movie VARCHAR(64) NOT NULL, 
  PRIMARY KEY (id), 
  UNIQUE (id), 
  FOREIGN KEY(customer) REFERENCES "Customer" (id)
);

让我们填充一些数据:

INSERT INTO Movie (id, customer, movie) VALUES(0, 0, 'Rambo');
INSERT INTO Movie (id, customer, movie) VALUES(1, 0, 'Rocky');
INSERT INTO Movie (id, customer, movie) VALUES(2, 1, 'Mamma Mia');
INSERT INTO Movie (id, customer, movie) VALUES(3, 1, 'Grease');
INSERT INTO Movie (id, customer, movie) VALUES(4, 0, 'Terminator');

只要您对应用一些聚合函数感到满意,您就可以像这样使用单个 SELECT:

SELECT
  customer, MAX(id),
  COUNT(DISTINCT id), AVG(LENGTH(movie)), SUM(LENGTH(movie))
FROM Movie GROUP BY customer;

如果您需要从 Customer 表中获取数据,您可能需要像这样进行连接:

SELECT
  Customer.name, Customer.id, MAX(Movie.id),
  COUNT(DISTINCT Movie.id), AVG(LENGTH(Movie.movie)), SUM(LENGTH(Movie.movie))
FROM Movie
JOIN Customer on Movie.customer=Customer.id
GROUP BY customer;

如果你想做 k-means,SQLite 是相当有限的,但使用其他方言你仍然可以做到。有关示例,请参见本文。在 Internet 上可以很容易地找到PostgreSQLMySQLSQL Server中的示例......你可以用谷歌搜索你的。

大多数其他 SQL 方言将具有一组更丰富的预定义函数。对于更复杂的分析,您可能需要定义自己的函数,并可能使用 SQL 中的结果。