1

我在 MS Access 中有一个表,基本上如下所示:

Table Name : Customer_Categories

+----------------------+------------+-------+
| Email                | CategoryID | Count |
+----------------------+------------+-------+
| jim@example.com      |         10 |     4 |
+----------------------+------------+-------+
| jim@example.com      |          2 |     1 |
+----------------------+------------+-------+
| simon@example.com    |          5 |     2 |
+----------------------+------------+-------+
| steven@example.com   |         10 |    16 |
+----------------------+------------+-------+
| steven@example.com   |          5 |     3 |
+----------------------+------------+-------+

在这个表中有 ≈ 350,000 条记录。特点是这样的:

  • Email、CategoryID 和 Count 的重复值
  • 计数是指该客户从该类别订购的次数

我想要的是

我想创建一个表,其中包含一个唯一的电子邮件地址以及该客户最常购买的 CategoryID。

所以上面的例子是:

+----------------------+------------+
| Email                | CategoryID |
+----------------------+------------+
| jim@example.com      |         10 |
+----------------------+------------+
| simon@example.com    |          5 |
+----------------------+------------+
| steven@example.com   |         10 |
+----------------------+------------+

我试过的

我写了一个查询来实现我想要的:

SELECT main.Email, (SELECT TOP 1 CategoryID
    FROM Customer_Categories
    WHERE main.Email = Email
    GROUP BY CategoryID
    ORDER BY MAX(Count) DESC, CategoryID ASC) AS Category
FROM Customer_Categories AS main
GROUP BY main.Email;

这是一种享受,完全符合我的要求。它会在大约 8 秒内返回结果。但是我需要在一个新表中使用这些数据,因为我想用 categoryID 更新另一个表。当我INTO Customer_Favourite_Categories在子查询之后添加以将此数据添加到新表中时,而不仅仅是返回结果集并运行查询,它永远不会完成。我已经让它运行了大约 45 分钟,它什么也没做。

有没有办法解决?

4

3 回答 3

2

如果select into不起作用,请使用insert into

create table Customer_Favorite_Categories (
    email <email type>,
    FavoriteCategory <CategoryId type>
);


insert into Customer_Favorite_Categories
  SELECT main.Email, (SELECT TOP 1 CategoryID
      FROM Customer_Categories
      WHERE main.Email = Email
      GROUP BY CategoryID
      ORDER BY MAX(Count) DESC, CategoryID ASC) AS Category
  FROM Customer_Categories AS main
  GROUP BY main.Email;
于 2013-08-06T13:25:37.787 回答
0

我经常为此使用子查询。您在“我尝试过的内容”中的查询很接近,但语法稍有偏差。像下面这样的东西应该得到你所追求的。Count 在方括号中,因为它是 SQL 中的保留字。我在 SQL 中使用的间距是常规的,因此可以根据自己的喜好进行编辑。

SELECT Email,
  CategoryID
FROM MyTable AS m,
  (
      SELECT Email,
        MAX( [Count] ) AS mc
      FROM MyTable
      GROUP BY Email
  ) AS f
WHERE m.Email = f.Email
AND m.[Count] = f.mc;
于 2013-08-07T22:02:31.547 回答
0

尝试这个:

SELECT Distinct(Email),Max(CategoryID )

 FROM Customer_Categories group by Email
于 2013-08-06T13:27:44.050 回答