简体   繁体   English

如何使用条件和 PARTITION BY 制作 ROW_NUMBER() function?

[英]How do I make a ROW_NUMBER() function with a condition and also PARTITION BY?

I'm looking for help on a SQL query.我正在寻求有关 SQL 查询的帮助。

Let's say I have a dataset that includes multiple levels of groups.假设我有一个包含多个级别组的数据集。 Here's an example: we have students, that took some class, and then had some tests in each class.这是一个例子:我们有学生,他们拿了一些 class,然后在每个 class 中进行了一些测试。 Let's say I have to use this dataset.假设我必须使用这个数据集。 I want to do some sort of query (I'm thinking ROW_NUMBER) that increments when there's a new Class ID, but not when there's a new Test ID, PARTITION BY Student ID.我想做某种查询(我在想 ROW_NUMBER),当有一个新的 Class ID 时会增加,但当有一个新的测试 ID 时不会增加,PARTITION BY Student ID。

Sample dataset:样本数据集:

StudentID   ClassID   TestID
----------------------------
1            1          1
1            2          1
1            3          1
2            1          1
2            1          2
3            2          1

Desired output:所需的 output:

StudentID   ClassID   TestID   ClassNumber
------------------------------------------
1            1          1      1
1            2          1      2
1            3          1      3
2            1          1      1
2            1          2      1
3            2          1      1

I want to do things like see if the student did better in their 2nd class versus their 1st class, regardless of what the class was.我想做一些事情,比如看看学生在他们的第二个 class 和他们的第一个 class 中是否做得更好,不管 class 是什么。

This is the code I'm trying:这是我正在尝试的代码:

SELECT 
    StudentID, ClassID, TestID, 
    ROW_NUMBER() OVER (PARTITION BY StudentID ORDER BY StudentID ASC) AS "ClassNumber"
FROM 
    mytable

Now I know this is WRONG, but I don't know how to get it to do what I want it to do?现在我知道这是错误的,但我不知道如何让它做我想做的事情?

From your sample data, it seems like you can use partition by studentID, testID order by ClassID :从您的示例数据来看,您似乎可以partition by studentID, testID order by ClassID

select 
    t.*,
    row_number() over(partition by studentID, testID order by ClassID) ClassNumber
from mytable t

Note: with that few sample data it is hard to tell wich ranking fucntion would best suit your use case ( row_number() , rank() , dense_rank() ).注意:使用这么少的样本数据,很难判断哪种排名功能最适合您的用例( row_number()rank()dense_rank() )。 Since you used row_number() , I sticked to it.由于您使用了row_number() ,所以我坚持使用它。

Demo on DB Fiddle DB Fiddle 上的演示

StudentID | ClassID | TestID | ClassNumber
--------: | ------: | -----: | :----------
        1 |       1 |      1 | 1          
        1 |       2 |      1 | 2          
        1 |       3 |      1 | 3          
        2 |       1 |      1 | 1          
        2 |       1 |      2 | 1          
        3 |       2 |      1 | 1          

You may want dense_rank() :您可能需要dense_rank()

dense_rank() over (partition by studentID order by ClassID) as ClassNumber

If you had:如果你有:

4            1          1
4            1          2
4            2          2

This would assign:这将分配:

4            1          1         1
4            1          2         1
4            2          2         2

which is how I understand your question.这就是我理解你的问题的方式。

I think this is what you are looking for:我认为这就是你要找的:

Select StudentID, 
ClassID, 
TestID, 
ROW_NUMBER() Over (Partition By StudentID, TestID Order By StudentID) As ClassNumber 
From myTable

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM