SQL:找出每个组每个 ID 的所有可能的年份组合

2024-02-27

我正在使用 Netezza SQL。

我有以下关于学生(2010-2015 年)的数据集(“my_table”)、他们当前就读的学位专业、参加考试的日期以及考试结果:

    student_id current_major year exam_result
1            1       Science 2010           0
2            1          Arts 2013           1
3            1          Arts 2013           0
4            2       Science 2010           1
5            2          Arts 2011           1
6            2       Science 2013           1
7            3          Arts 2010           1
8            3          Arts 2015           1
9            4          Arts 2010           0
10           4       Science 2013           1
11           5          Arts 2010           0
12           5          Arts 2011           0
13           5       Science 2012           1

我的问题:我想知道是否initial学生开始获得的学位会影响学生在大学学习的年限。 (分析期间为 2010 年至 2015 年——学生可以在 2010 年至 2015 年期间的任何时间加入大学。)

为了回答这个问题,我首先想做一个表格,显示每个年份组合就读该大学的学生人数:

select year_2010,
 year_2011,
year_2012,
 year_2013,
 year_2014,
 year_2015, 
count(*) 
from
(
select student_id,
max(case when (year = 2010) then 1 else 0 end) as 'year_2010',
max(case when (year = 2011) then 1 else 0 end) as 'year_2011',
max(case when (year = 2012) then 1 else 0 end) as 'year_2012',
max(case when (year = 2013) then 1 else 0 end) as 'year_2013',
max(case when (year = 2014) then 1 else 0 end) as 'year_2014',
max(case when (year = 2015) then 1 else 0 end) as 'year_2015',
from my_table
group by student_id)a
group by year_2010,
 year_2011,
 year_2012,
 year_2013,
 year_2014,
 year_2015;


   year_2010 year_2011 year_2012 year_2013 year_2014 year_2015 count_star()
1          0         1         0         1         0         0           24
2          0         0         0         0         1         1           17
3          0         0         1         1         0         0           22
4          1         1         1         0         0         0           12
5          0         1         1         1         1         0           12
6          1         0         0         0         1         0           23
7          0         0         1         0         0         0           49

我的问题: 现在,我想使用每个学生最早可用的专业对该表进行“分组”(即学生在大学的第一年学习什么)。为了解决这个问题,我们假设学生在第一年不能改变专业,必须至少等到第二年才能改变专业。然而,从第二年开始,学生可以在同一年内多次转换学位专业。

我想回答以下问题:

  • 在 2010 年入学并开始学习科学的学生中,有多少人连续学习了 5 年?

  • 在 2011 年入读大学并最初开始学习艺术的学生中,有多少学生在 2011 年至 2015 年间学习了至少 2 年?

我认为此类问题可以这样回答:

  • 步骤 1:使用 PARTITION 函数找出最早的年份(通过 CTE)
  • 第 2 步:使用现有查询
  • 步骤 3:将步骤 1 和步骤 2 的结果连接在一起

这是我的尝试:

WITH earliest_major AS (
    SELECT student_id, current_major AS earliest_major
    FROM (
        SELECT student_id, current_major, year,
        ROW_NUMBER() OVER (PARTITION BY student_id ORDER BY year) AS rn
        FROM my_table
    ) sub
    WHERE rn = 1
)
SELECT em.earliest_major,
       year_2010,
       year_2011,
       year_2012,
       year_2013,
       year_2014,
       year_2015, 
       COUNT(*) 
FROM (
    SELECT student_id,
           MAX(CASE WHEN (year = 2010) THEN 1 ELSE 0 END) AS year_2010,
           MAX(CASE WHEN (year = 2011) THEN 1 ELSE 0 END) AS year_2011,
           MAX(CASE WHEN (year = 2012) THEN 1 ELSE 0 END) AS year_2012,
           MAX(CASE WHEN (year = 2013) THEN 1 ELSE 0 END) AS year_2013,
           MAX(CASE WHEN (year = 2014) THEN 1 ELSE 0 END) AS year_2014,
           MAX(CASE WHEN (year = 2015) THEN 1 ELSE 0 END) AS year_2015
    FROM my_table
    GROUP BY student_id
) a
JOIN earliest_major em ON a.student_id = em.student_id
GROUP BY em.earliest_major, 
         year_2010, 
         year_2011, 
         year_2012, 
         year_2013, 
         year_2014, 
         year_2015;

该查询似乎运行并以所需的格式生成结果:

  earliest_major year_2010 year_2011 year_2012 year_2013 year_2014 year_2015 count_star()
1         Science         0         1         0         1         0         0           15
2            Arts         0         0         0         0         1         1           11
3            Arts         0         0         1         1         0         0           13
4            Arts         1         1         1         0         0         0            8
5         Science         0         1         1         1         1         0            7

但我不确定我的逻辑是否正确 - 有人可以帮助我吗?

Thanks!


我认为你应该放弃你的柱状格式和你的案例。您实际上需要一个直方图。最好采用“长”格式;如果需要,应用层可以重新格式化。

create table major_exams(
  student_id int not null,
  current_major text not null,
  year smallint not null check (year between 1900 and 2200),
  exam_result boolean not null
);

insert into major_exams(student_id, current_major, year, exam_result) values
( 1, 'Science', 2010, false),
( 1,    'Arts', 2013, true),
( 1,    'Arts', 2013, false),
( 2, 'Science', 2010, true),
( 2,    'Arts', 2011, true),
( 2, 'Science', 2013, true),
( 3,    'Arts', 2010, true),
( 3,    'Arts', 2015, true),
( 4,    'Arts', 2010, false),
( 4, 'Science', 2013, true),
( 5,    'Arts', 2010, false),
( 5,    'Arts', 2011, false),
( 5, 'Science', 2012, true);

select major, duration, count(*) as n
from (
    select first_majors.major,
        last_majors.year - first_majors.year + 1 as duration
    from (
        select distinct on (student_id) student_id, current_major as major, year
        from major_exams
        order by student_id, year
    ) first_majors
    join (
        select student_id, max(year) as year
        from major_exams
        group by student_id
    ) last_majors on last_majors.student_id = first_majors.student_id
) major_bounds
group by major, duration
order by major, duration;
major       duration    n
Arts        3           1
Arts        4           1
Arts        6           1
Science     4           2
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SQL:找出每个组每个 ID 的所有可能的年份组合 的相关文章

  • SQL 多次更新与单次更新性能

    假设我有 10 000 行需要更新 什么会更快 UPDATE DB Servers SET Live 1 where name server1 UPDATE DB Servers SET Live 1 where name server2
  • 如何在TOAD的DataGrid中显示sys_refcursor数据

    请我需要帮助 我搜索了很多并且变得更加困惑 我使用 Toad 9 7 25 并且我做了这个程序 在一个包中 PROCEDURE ReportaCC pfcorte IN DATE lcursor IN OUT SYS REFCURSOR I
  • 插入后用触发器更新多行(sql server)

    我有一个表 orderDetails 包含订单的产品 产品编号 color size quantity 和一个表库存 产品编号 size color stock 订单完成后 我使用此查询将项目插入表中orderDetails INSERT
  • 表名搜索

    我使用以下命令在特定数据库的存储过程中搜索字符串 USE DBname SELECT Name FROM sys procedures WHERE OBJECT DEFINITION OBJECT ID LIKE xxx 修改上面的内容是否
  • PHP PDO相关:更新SQL语句未更新数据库内容

    我正在尝试使用准备好的语句来实现更新语句PHP http en wikipedia org wiki PHP脚本 但它似乎没有更新数据库中的记录 我不确定为什么 所以如果您能分享一些见解 我将不胜感激 Code query UPDATE D
  • 使用按位函数查询 BIT 字段时,MySQL 不使用索引

    我的 MySQL 表中有一个 BIT 类型的字段 我想使用位值存储记录的状态 例如 1 status1 2 status2 4 status3 8 status4 每条记录可以同时具有多种状态 对于 status1 和 status3 该值
  • java.sql.Timestamp 到微秒精度的字符串

    我正在将时间戳列从数据库读取到 java sql Timestamp 对象中 然后我想将时间戳的值转换为 String 对象 但保持微秒精度 调用 toString 方法让我接近 但它似乎在微秒内丢失了尾随零 如果时间戳以非零数字结尾 则一
  • 创建表作为 select 删除 postgresql 中的非空约束

    在 postgres sql 中 创建表时 select 删除了表上的非空约束 例如 对此没有单一命令的解决方案 要基于现有表 包括所有约束 创建表 请使用 create table B like a including constrain
  • 如何查找 PostgreSQL 数据库的上次更新时间?

    我正在使用一个批量更新的 postgreSQL 数据库 我需要知道数据库 或数据库中的表 上次更新或修改的时间 两者都可以 我看到 postgreSQL 论坛上有人建议使用日志记录并查询日志 这对我不起作用 因为我无法控制客户端代码库 你可
  • 插入多行并返回主键时 Sqlalchemy 的奇怪行为

    插入多行并返回主键时 我注意到一些奇怪的事情 如果我在 isert 查询中添加使用参数值 我会得到预期的行为 但是当将值传递给游标时 不会返回任何内容 这可能是一个错误还是我误解了什么 我的sqlachemy版本是0 9 4 下面如何重现错
  • 对于数据库来说,选择正确的数据类型会影响性能吗?

    如果是这样 为什么 我的意思是 tinyint 的搜索速度比 int 快吗 如果是这样 性能上的实际差异是什么 是的 根据数据类型 它确实有所不同 int vs tinyint不会在速度上产生明显的差异 但会在数据大小上产生差异 假设tin
  • 使用 MS Access 获取行的第一个实例

    EDITED 我有这个查询 我想SELECT表中记录的第一个实例petTable SELECT id pet ID FIRST petName First Description FROM petTable GROUP BY pet ID
  • SPARK SQL - 当时的情况

    我是 SPARK SQL 的新手 SPARK SQL 中是否有相当于 CASE WHEN CONDITION THEN 0 ELSE 1 END 的内容 select case when 1 1 then 1 else 0 end from
  • 根据表sql中的行替换字符串中的字符

    我需要用一些映射的字符替换字符串中的字符列表 我有一个表 dbo CharacterMappings 有 2 列 CharacterToFilter 和 ReplacementCharacter 假设这个表中有3条记录 Filter Rep
  • 连接两个表的查询的 SQL Server“FOR XML”输出

    我是 SQL Server 中 FOR XML 功能的新手 我正在使用 SQL Server 2012 我有两个表 Word 和 Word Expansion 样本数据 表 字 WordOID Word 1 PIPE 2 WIRE 表 Wo
  • PHP 绑定“bigint”数据类型(MySQLi 准备好的语句)

    studentId 57004542323382 companyOfferId 7 sql INSERT INTO studentPlacement companyOfferId studentId VALUES if stmt db gt
  • Mysql 检索所有有限制的行

    我想检索特定用户的所有行 限制为 0 x 所以我只是想问是否有任何方法可以检索 mysql 中的所有行 而不调用返回 x 的 count id 的方法 而不重载现有函数 该函数在查询中根本没有限制 与我们的 string Relace 功能
  • 在sqlite SQL语句中与order by子句结合使用limit

    下面的两条 SQL 语句总是会产生相同的结果集吗 1 SELECT FROM MyTable where Status 0 order by StartTime asc limit 10 2 SELECT FROM SELECT FROM
  • Laravel leftJoin 仅右表的最后一条记录

    我是 Laravel 的新手 我有两张桌子 1 产品 2 价格 products id product int p key name varchar prices id price int p key id product int
  • 对多个数据库执行 SQL 查询

    我知道我的帖子与该论坛中的其他帖子的标题非常相似 但我真的找不到我需要的答案 这是我的问题 我的 Windows Server 上运行着 SQL Server 在我的 SQL Server 中 我有大约 30 个数据库 它们都具有相同的表和

随机推荐

  • 从 hbm 文件生成带注释的 java 类

    我有一个旧项目 其中 java 类是从 hbm 文件生成的 是否可以使用这些 hbm 文件生成带注释的 java 类 我们遇到了同样的问题 并通过使用此 hbm 注释转换器脚本解决了该问题https github com Schweizer
  • Microsoft.Azure.WebJobs.Extensions.Http:无法加载文件或程序集

    我在 VS Code 的虚拟环境中工作 我不明白为什么会收到此错误 2022 07 19T10 00 31 580Z A host error has occurred during startup operation 609dfded e
  • opencv 可以与 Objective C 混合编译用于 OS X 应用程序开发吗?

    我想使用 OS X 默认 GUI 如 NSImageView 来显示 OS X 应用程序 而不是 iOS 的 OpenCV 图像 因此我需要使用 Objective C 和 C 这对于 Apple LLVM 编译器来说并不是什么大问题 但是
  • useReducer 中返回参数的通用类型

    我正在编写一个自定义挂钩来从 API 获取一些数据 如果可能的话 我希望返回的数据是类型安全的 这可以用泛型来完成吗 type Action type PENDING type SUCCESS payload any type FAIL i
  • 如何修复 strcpy 以便检测重叠字符串

    在一次采访中 我被要求编写一个实现strcpy https en cppreference com w c string byte strcpy然后修复它 以便它正确处理重叠的字符串 我的实现如下 非常幼稚 我该如何修复它 以便 它检测重叠
  • 如何使用特定版本的 ChromeDriver,同时 Chrome 浏览器通过 Python selenium 自动更新

    我是 Selenium 的新手 现在我可以使用 selenium 和 Chromedriver 进行基本的自动测试 代码工作正常 但问题是 Chrome 浏览器总是在后端自动更新 并且 Chrome 更新后代码总是无法运行 我知道我需要下载
  • 如何避免JFrame EXIT_ON_CLOSE操作退出整个应用程序?

    我有一个可以启动其他应用程序的应用程序 例如扩展坞 问题是 如果我正在启动的应用程序 JFrame 有EXIT ON CLOSE它还将关闭我的主应用程序 我无法控制我正在启动的应用程序 也就是说 我不能期望应用程序具有良好的行为和使用DIS
  • JQuery 的黄色淡入淡出效果

    我想实现类似的东西37Signals 的黄色淡出效果 http www 37signals com svn archives 000558 php 我正在使用 Jquery 1 3 2 代码 function fn yellowFade f
  • CRC-CCITT (0xFFFF) 功能?

    有人可以帮我用 Delphi 实现 CRC CCITT 0xFFFF 已经获得 Java 版本 但对如何将其移植到 Delphi 感到困惑 public static int CRC16CCITT byte bytes int crc 0x
  • C++ 可能的空指针取消引用

    我对一些代码运行了 cppcheck 以查找可能的运行时错误 在以下情况下 它报告可能存在空指针取消引用 Foo x defined somewhere Foo y x possible null pointer dereference 编
  • 使用 std::for_each 改变对象可以吗?

    for each 接受 InputIterators from c standard template
  • Team Foundation 服务 签入时的强制性评论

    我正在使用 Microsoft 的新 Team Foundation Service http tfs visualstudio com http tfs visualstudio com 我想知道是否可以在办理入住时强制提出评论 例如如果
  • 如何使用用户栏进行交易?

    我得到了使用 sqlalchemy continuum 的建议 它似乎可以立即完成我想要的功能 默认情况下 ORM 假定存在一个用户列 我确实想保存编辑的发起者 但是只说 这就是指定 User 类的方式 而没有说明实际使用版本化表时如何指定
  • 将 HTML 转换为 Word 文件?

    如何将 ruby 文件转换为 word 文件 即 docx 文件 对于pdf 大家宝石大虾 但是有没有word文件的gem 我正在尝试将我的html文件转换为word文件 以便用户也可以编辑它 这种情况应该怎么办 我本来打算将该文件转换为w
  • 白线出现在特定浏览器宽度的渐变填充 div 的末尾

    我有一个带有 id 的 div gradient div with a background image set to linear gradient 我在线性渐变的末尾和 div 的末尾之间发现了间隙 gradient div仅在某些浏览
  • 如何动态访问 Django 模型字段详细名称?

    我想访问我的模型字段 verbose name 我可以通过这样的字段索引来获取它 model meta fields 2 verbose name 但我需要动态获取它 理想情况下应该是这样的 model meta fields locati
  • 使用 Spring Data 从 RDBMS 刷新 ElasticSearch 索引

    我有以下设置 Mysql RDBMS 服务器 弹性搜索服务器 我的要求是定期从 MYSQL RDBMS 复制数据并用它更新弹性服务器 目前我正在遵循以下方法 使用 Spring Data Jpa 从 MYSQL 读取所有数据的批处理作业 然
  • 如何在 Rust 中创建参数化测试?

    我想编写依赖于参数的测试用例 我的测试用例应该针对每个参数执行 我想看看每个参数是否成功或失败 我习惯用Java编写这样的东西 RunWith Parameterized class public class FibonacciTest P
  • STL容器的二进制兼容性

    假设我用 C 编写了一个 DLL 并且想要导出一个采用 std vector 参数的方法 我可以希望不同的 STL 版本之间有二进制兼容性吗 我不知道版本之间的兼容性有任何保证 甚至同一编译器上的发布和调试之间也没有保证 一种解决方案是为向
  • SQL:找出每个组每个 ID 的所有可能的年份组合

    我正在使用 Netezza SQL 我有以下关于学生 2010 2015 年 的数据集 my table 他们当前就读的学位专业 参加考试的日期以及考试结果 student id current major year exam result