我如何计算 sql 中的相同行
How I can count identical rows in sql
我有2张桌子。
Table 交易:
id | customer_id | department_id
--------------------------------
1 | 1 | 2
--------------------------------
2 | 2 | 3
--------------------------------
3 | 2 | 4
--------------------------------
4 | 3 | 1
--------------------------------
5 | 2 | 3
--------------------------------
Table des_department
id | caption
-----------------
1 | department1
-----------------
2 | department2
-----------------
3 | department3
-----------------
4 | department4
-----------------
5 | department5
-----------------
我需要为每个 customer_id 显示部门 标题。选择用户访问次数最多的部门。
输出示例:
customer_id | caption
------------------------------
1 | department2
------------------------------
2 | department3
------------------------------
3 | department1
------------------------------
我也有自己的疑问。但是我显示所有访问次数。
我的查询:
SELECT t.customer_id, t.terminal_i
FROM transaction t WHERE (t.customer_id, t.terminal_id) IN
( SELECT t1.customer_id, t1.terminal_id
FROM transaction t1 GROUP BY t1.customer_id
)
我在 dbForge 工作 Mysql。
这种类型的查询在 MySQL 中不必要地麻烦(因为 MySQL 既不支持常见的 table 表达式也不支持 window 函数)。
一种方法是将 table 聚合两次,一次计算每个 customer/department 的计数。第二次获得每个客户的最大值。然后将其加入到按客户和部门汇总的 table 以获得最大部门值。
SELECT t.customer_id, d.caption
FROM (SELECT td.customer_id, MAX(cnt) as maxcnt
FROM (SELECT t.customer_id, t.deparment_id, COUNT(t.terminal_id) as cnt
FROM transaction t
GROUP BY t.customer_id, t.department_id
) td
GROUP BY t.customer_id
) tt JOIN
(SELECT t.customer_id, t.deparment_id, COUNT(t.terminal_id) as cnt
FROM transaction t
GROUP BY t.customer_id, t.deparment_id
) td
ON t.customer_id = tt.customer_id and td.cnt = tt.cnt JOIN
des_department d
ON td.department_id = d.id
我通过在互联网上进行研究来编写此查询,可能会对某些人有所帮助。
这是 sql 代码:
SELECT customer_id, dd.caption
FROM
(SELECT t.customer_id, t.deparment_id
FROM (SELECT t.customer_id, t.deparment_id, COUNT(t.deparment_id) AS ter
FROM transaction t
GROUP BY t.customer_id, t.deparment_id) t
WHERE NOT EXISTS (SELECT 1
FROM (SELECT t.customer_id, t.deparment_id, COUNT(t.deparment_id) AS ter
FROM transaction t
GROUP BY t.customer_id, t.deparment_id) td
WHERE td.customer_id = t.customer_id AND td.ter>t.ter
))
tx
INNER JOIN des_department dd
ON tx.deparment_id = dd.id
我有2张桌子。
Table 交易:
id | customer_id | department_id
--------------------------------
1 | 1 | 2
--------------------------------
2 | 2 | 3
--------------------------------
3 | 2 | 4
--------------------------------
4 | 3 | 1
--------------------------------
5 | 2 | 3
--------------------------------
Table des_department
id | caption
-----------------
1 | department1
-----------------
2 | department2
-----------------
3 | department3
-----------------
4 | department4
-----------------
5 | department5
-----------------
我需要为每个 customer_id 显示部门 标题。选择用户访问次数最多的部门。
输出示例:
customer_id | caption
------------------------------
1 | department2
------------------------------
2 | department3
------------------------------
3 | department1
------------------------------
我也有自己的疑问。但是我显示所有访问次数。
我的查询:
SELECT t.customer_id, t.terminal_i
FROM transaction t WHERE (t.customer_id, t.terminal_id) IN
( SELECT t1.customer_id, t1.terminal_id
FROM transaction t1 GROUP BY t1.customer_id
)
我在 dbForge 工作 Mysql。
这种类型的查询在 MySQL 中不必要地麻烦(因为 MySQL 既不支持常见的 table 表达式也不支持 window 函数)。
一种方法是将 table 聚合两次,一次计算每个 customer/department 的计数。第二次获得每个客户的最大值。然后将其加入到按客户和部门汇总的 table 以获得最大部门值。
SELECT t.customer_id, d.caption
FROM (SELECT td.customer_id, MAX(cnt) as maxcnt
FROM (SELECT t.customer_id, t.deparment_id, COUNT(t.terminal_id) as cnt
FROM transaction t
GROUP BY t.customer_id, t.department_id
) td
GROUP BY t.customer_id
) tt JOIN
(SELECT t.customer_id, t.deparment_id, COUNT(t.terminal_id) as cnt
FROM transaction t
GROUP BY t.customer_id, t.deparment_id
) td
ON t.customer_id = tt.customer_id and td.cnt = tt.cnt JOIN
des_department d
ON td.department_id = d.id
我通过在互联网上进行研究来编写此查询,可能会对某些人有所帮助。 这是 sql 代码:
SELECT customer_id, dd.caption
FROM
(SELECT t.customer_id, t.deparment_id
FROM (SELECT t.customer_id, t.deparment_id, COUNT(t.deparment_id) AS ter
FROM transaction t
GROUP BY t.customer_id, t.deparment_id) t
WHERE NOT EXISTS (SELECT 1
FROM (SELECT t.customer_id, t.deparment_id, COUNT(t.deparment_id) AS ter
FROM transaction t
GROUP BY t.customer_id, t.deparment_id) td
WHERE td.customer_id = t.customer_id AND td.ter>t.ter
))
tx
INNER JOIN des_department dd
ON tx.deparment_id = dd.id