MySQL基于客户的不同字段数

时间:2019-07-04 10:37:03

标签: mysql

我有下面的MySQL表,

id   customer  Field_Name
1   C1  A
2   C1  B
3   C1  C
4   C1  D
5   C2  A
6   C2  D
7   C2  E
9   C3  B
10  C3  F

客户“ C1”的字段数最多(4)-A,B,C,D, “ C2”具有3个字段-A,D,E和 “ C3”具有2个字段-B,F

由于客户“ C1”具有更多字段,因此应该首先将其用于比较客户

“ C2”具有A和D-“ C1”已经具有这两个字段,E是“ C2”中唯一的唯一

“ C3”具有B-“ C1”具有此字段,F仅是唯一的。

类似地,它继续...

我需要根据客户来选择不同的字段,但要根据具有更多字段的客户来选择。

预期结果:

id   customer  Field_Name
1   C1  A
2   C1  B
3   C1  C
4   C1  D
7   C2  E
10  C3  F

2 个答案:

答案 0 :(得分:1)

如果您使用的是MySQL 8+,则该问题相当容易解决:

WITH cte1 AS (
    SELECT *, COUNT(*) OVER (PARTITION BY customer) cnt
    FROM customers
),
cte2 AS (
    SELECT *,
        ROW_NUMBER() OVER (PARTITION BY Field_Name ORDER BY cnt DESC) rn
    FROM cte1
)

SELECT id, customer, Field_Name
FROM cte2
WHERE rn = 1;

Demo

在早期版本的MySQL中,应该有可能实现相同的逻辑,但是总的来说,模拟ROW_NUMBER可能会很麻烦。

答案 1 :(得分:0)

没有窗口功能,对于早期版本的MySql,可以使用NOT EXISTS:

select * from tablename t
where not exists (
  select 1 from tablename tt
  where tt.customer <> t.customer and tt.field_name = t.field_name and 
    (select count(*) from tablename where customer = tt.customer) > 
    (select count(*) from tablename where customer = t.customer)
)

请参见demo
结果:

| id  | customer | field_name |
| --- | -------- | ---------- |
| 1   | C1       | A          |
| 2   | C1       | B          |
| 3   | C1       | C          |
| 4   | C1       | D          |
| 7   | C2       | E          |
| 10  | C3       | F          |