SQL:按行条目数排序并加入

Posted

技术标签:

【中文标题】SQL:按行条目数排序并加入【英文标题】:SQL: Sort on number of row entries and join 【发布时间】:2015-09-16 18:57:07 【问题描述】:

如何在列中查找重复条目(如 student_id 列中的多行)并将它们连接到具有公共 id 的另一个表(如从另一个表中获取 student_name 的 student_id)?

成绩:

student_id,grade
6,A
1,B
1,F
7,C
6,A

学生:

student_id,student_name
1,roy
6,bob
7,art

这样我就可以在student_id 上获得一个只有重复 个学生行的连接表,类似于:

student_id,student_name,grade
6,bob,A
1,roy,B
1,roy,F
6,bob,A

最好只返回最新数据框的名称:

bob
roy

【问题讨论】:

我不明白,你只需要学生姓名吗? 【参考方案1】:

试试这个:

select students.student_name
from grades 
inner join students on grades.student_id = students.student_id
group by student_name
having count(*) > 1

例子:

create table grades (student_id int, grade char(1));
insert into grades values (6, 'A'), (1, 'B'), (1, 'F'), (7, 'C'), (6, 'A');
create table students (student_id int, student_name varchar(20));
insert into students values (1, 'roy'), (6,'bob'), (7,'art');

select students.student_name
from grades 
inner join students on grades.student_id = students.student_id
group by student_name
having count(*) > 1

Result:
student_name
bob
roy

这应该会产生 bob 和 roy。

Linux 上的命令行,假设你有 sqlite:

~$ sqlite
SQLite version 2.8.17
Enter ".help" for instructions
sqlite> create table grades (student_id int, grade char(1));
sqlite> insert into grades values (6, 'A');
sqlite> insert into grades values (1, 'B');
sqlite> insert into grades values (1, 'F');
sqlite> insert into grades values (7, 'C');
sqlite> insert into grades values (6, 'A');
sqlite>
sqlite> create table students (student_id int, student_name varchar(20));
sqlite> insert into students values (1, 'roy');
sqlite> insert into students values (6,'bob');
sqlite> insert into students values (7,'art');
sqlite>
sqlite> select students.student_name
   ...> from grades
   ...> inner join students on grades.student_id = students.student_id
   ...> group by student_name
   ...> having count(*) > 1;
roy
bob
sqlite>

【讨论】:

谢谢!在 linux 命令行中测试您的建议的最佳方法是什么?我将成绩和学生表作为单独的 csv 文件。起初,我使用的是 pandas 和 sqlite3,但必须有一个更清洁、更快速的方法!这是什么? 您可以使用 sqlfiddle.com 进行测试。我在小提琴上创建了这个例子:sqlfiddle.com/#!9/1365a/1 我已经编辑了我的答案,以展示一个您可以在 Linux 上尝试使用 SQLite 的示例【参考方案2】:

查找重复项,然后将其加入以获取更多信息:

SELECT s.student_id, s.student_name
FROM student s
INNER JOIN
   (SELECT g.student_id
    FROM grades g
    GROUP BY g.student_id
    HAVING COUNT(*) > 1) dups
 ON s.student_id = dups.student_id

【讨论】:

COUNT(*) 而不是COUNT(grades)。见***.com/questions/2876909/…

以上是关于SQL:按行条目数排序并加入的主要内容,如果未能解决你的问题,请参考以下文章

如何把SQL的表按行进行排序或进行表的行列转换

在 Laravel 5 中按行排序并限制结果

如何在动态数据透视中先按行排序,然后按列排序

MySQL中select语句使用order按行排序

Excel小技巧-你是否只知道表格按列排序?其实也可以按行排序!excel数据按行排序

如何拆分具有字符串和双精度的输入文本文件?