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 的所有可能的年份组合 的相关文章

  • 对于返回超过1个值的SQL select,当Id为GUID时它们如何排序?

    我想知道 SQL Server 如何对查询返回的数据进行排序 并且各个表的 Id 列都是 uniqueidentifier 类型 我在创建所有 GUID 时使用 NHibernate GuidComb 并执行以下操作 Sheet sheet
  • SQL 选择 n 到 m 关系

    我有一个n to m之间的关系Author and Book 表作者 ID Name 1 Follett 2 Rowling 3 Martin 桌书 ID Title Category 1 A Dance with Dragons Fant
  • 如何在 PostgreSQL 中使用条件和子查询创建唯一索引?

    我使用 PGSQL 并尝试添加下面的索引 CREATE UNIQUE INDEX fk client ON user client fk client WHERE fk client NOT IN SELECT fk client FROM
  • 如何将事物的组合映射到关系数据库?

    我有一个表 其记录代表某些对象 为了简单起见 我假设该表只有一列 这是唯一的ObjectId 现在我需要一种方法来存储该表中的对象组合 组合必须是唯一的 但可以是任意长度 例如 如果我有ObjectIds 1 2 3 4 我想存储以下组合
  • 最近邻居的 Postgis SQL

    我正在尝试计算最近的邻居 为此 我需要传递一个参数来限制与邻居的最大距离 例如 半径1000米内最近的邻居是哪些 我做了以下事情 我用数据创建了表 id name latitude longitude 之后 我执行了以下查询 SELECT
  • 我应该使用平面表还是标准化数据库?

    我目前正在开发一个使用 MySQL 数据库作为后端的 Web 应用程序 在继续下一步之前 我需要知道什么更适合我的情况 简而言之 在这个应用程序中 用户将能够使用任何数字字段 他们决定 构建自己的表单 现在我将其全部存储在通过外键链接的几个
  • SQL UPDATE 语句根据另一个现有行更新列

    基本上我有一个与下表具有相似格式的表格 我想做的是根据这个逻辑更新 Col4 如果 Col2 为空 则用 Col3 更新 Col4 如果 Col2 不为 null 则在 Col1 中查找与 Col2 中的值匹配的值 使用 col3 中的相应
  • 使用条件 SQL 统计每月汇总记录

    我有一张桌子 我们就叫他们桌子吧SUMMARYDATA NIP NAME DEPARTMENT STATUSIN STATUSOUT TOTALLOSTTIME A1 ARIA BB 2020 01 21 08 06 23 2020 01
  • Magento --“SQLSTATE[23000]:违反完整性约束..”客户更新

    迁移服务器后 每次尝试更新客户信息时都会出现错误 我正在使用一个客户激活插件 http www magentocommerce com magento connect vinai extension 489 customer activat
  • 如何引用下一行的数据?

    我正在 PostgreSQL 9 2 中编写一个函数 对于股票价格和日期的表 我想计算每个条目较前一天的百分比变化 对于最早一天的数据 不会有前一天 因此该条目可以简单地为 Nil 我知道WITH声明可能不应该高于IF陈述 到目前为止 这就
  • 在 PostgreSql 中计算百分比

    例如我有一个这样的表 string adm A 2 A 1 B 2 A 1 C 1 A 2 通过 SQL 查询 我想要这样的结果 string perc adm A 50 B 100 C 0 我想要每个字符串中数字 2 出现的百分比 我可以
  • 标量子查询包含多行

    我正在使用 H2 数据库并想要移动一些数据 为此 我创建了以下查询 UPDATE CUSTOMER SET EMAIL SELECT service EMAIL FROM CUSTOMER SERVICE AS service INNER
  • 没有为 1 个或多个必需参数给出值。更新SQL

    我正在编写一个程序 当用户在列表视图上选择记录时 该程序会更新密码或积分 我收到错误 没有为 1 个或多个必需参数给出值 我不知道如何纠正 我是否遗漏了一些明显的东西 Dim sql As String UPDATE Users SET P
  • 以编程方式插入行(父行和子行)

    我正在使用 Spring 和 JDBCTemplate 该场景是 CUSTOMER 表和 ORDERS 表的父子关系 我想做一个插入 例如 1 个客户和 5 个订单 但我不确定如何以编程方式在 CUSTOMER 表中插入一行 如何获取 Or
  • 选择多列 按一列分组 按计数排序

    我在Oracle中有以下数据集 c1 c2 c3 1A2 cat black 1G2 dog red B11 frog green 1G2 girl red 试图得到以下结果 基本上我首先尝试获取具有重复 c1 的行 c1 c2 c3 1G
  • postgresql:插入...(选择*...)

    我不确定它是否是标准 SQL INSERT INTO tblA SELECT id time FROM tblB WHERE time gt 1000 我正在寻找的是 如果 tblA 和 tblB 位于不同的数据库服务器中怎么办 Postg
  • 3 个表的 SQL 查询(或联接)

    第一次在 Stack Overflow 上问问题 很棒的资源 但是只有一件事真正让我作为 SQL 新手感到困惑 我有三个表 我想获取与鲍勃的学生相关的所有导师的姓名 表 1 教师 ID Name 1 Bob 表 2 学生 STUDENT I
  • Java、Oracle 中索引处缺少 IN 或 OUT 参数:: 1 错误

    您好 我使用 Netbeans 8 0 2 和 Oracle 11g Express Edition 在 JSF 2 2 中编写了一个图书馆管理系统 我有几个名为 书籍 借阅者 等的页面 以及数据库中一些名为相同名称的表 我的问题是这样的
  • Oracle SQL 函数中可以有 commit 语句吗

    在 SQL 函数中使用 COMMIT 语句是否可能 有意义 从技术上来说 答案是肯定的 你can请执行下列操作 create or replace function committest return number as begin upd
  • 如何使用原始 SQL 查询实现搜索功能

    我正在创建一个由 CS50 的网络系列指导的应用程序 这要求我仅使用原始 SQL 查询而不是 ORM 我正在尝试创建一个搜索功能 用户可以在其中查找存储在数据库中的书籍列表 我希望他们能够查询 书籍 表中的 ISBN 标题 作者列 目前 它

随机推荐

  • 从 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