我有下面的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
答案 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;
在早期版本的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 |