当存在唯一值但存在重复值时,我该如何计数,计数保持不变
how do i count up when there is a unique value but when there is a duplicate value the count remains the same
Question_id
Question
part_model_ans
part_total_marks
answer_mark
number
16
What's a potato
It's a vegetable
1
5
1
16
What's a potato
It's a seed
2
5
1
16
4+4
8
2
5
2
17
What's a dog
It's a mammal
1
5
1
17
What's a dog
It's a pet
2
5
1
17
8+8
16
2
5
2
SELECT Q.question_id,Q.question, PMA.part_model_ans,QP.part_total_marks,MA.answer_mark
DENSE_RANK() over(Partition by QP.question_id) as number FROM "QUESTIONS" Q
LEFT JOIN "QUESTIONS_PART" QP ON QP.question_id = Q.question_id
LEFT join "PART_MODEL_ANSWER" PMA ON PMA.part_id = QP.part_id
LEFT join "MODEL_ANSWER" MA ON MA.question_id = Q.question_id
ORDER BY Q.question_id ASC
我想做的是在有唯一问题时增加计数,但在有重复问题时计数保持不变,每个问题后计数也会重置,我尝试使用密集排名但它使number
列中所有值的值为 1
我想你想要 order by
,而不是 partition by
:
DENSE_RANK() OVER (ORDER BY QP.question_id) as number
表是无序集,因此要使其正常工作,您需要一个定义行顺序的列,以便您可以按该顺序检查列 Question
的值是否更改。
我在你的示例数据中没有看到这样的列,所以我将使用 SQLite 的 rowid
.
创建一个 CTE,它将 return 列 flag
指示某行是否是新 Question
的开始。
最后使用 SUM()
window 函数得到你想要的结果:
WITH cte AS (
SELECT Q.Question_id, Q.Question, PMA.part_model_ans, QP.part_total_marks, MA.answer_mark, Q.rowid,
Q.Question <> LAG(Q.Question, 1, '') OVER (PARTITION BY Q.Question_id ORDER BY Q.rowid) flag
FROM QUESTIONS Q
LEFT JOIN QUESTIONS_PART QP ON QP.question_id = Q.question_id
LEFT JOIN PART_MODEL_ANSWER PMA ON PMA.part_id = QP.part_id
LEFT JOIN MODEL_ANSWER MA ON MA.question_id = Q.question_id
)
SELECT Question_id, Question, part_model_ans, part_total_marks, answer_mark,
SUM(flag) OVER (PARTITION BY Question_id ORDER BY rowid) number
FROM cte
ORDER BY question_id
查看简化版 demo.
您想按问题排序,这样 window 函数将区分问题(SQL Fiddle 供进一步参考):
SELECT
Question,
DENSE_RANK() OVER (ORDER BY Question) AS ranker
FROM your_data;
输出:
Question ranker
----------------- ------
"4+4" 1
"8+8" 2
"What's a dog" 3
"What's a dog" 3
"What's a potato" 4
"What's a potato" 4
Question_id | Question | part_model_ans | part_total_marks | answer_mark | number |
---|---|---|---|---|---|
16 | What's a potato | It's a vegetable | 1 | 5 | 1 |
16 | What's a potato | It's a seed | 2 | 5 | 1 |
16 | 4+4 | 8 | 2 | 5 | 2 |
17 | What's a dog | It's a mammal | 1 | 5 | 1 |
17 | What's a dog | It's a pet | 2 | 5 | 1 |
17 | 8+8 | 16 | 2 | 5 | 2 |
SELECT Q.question_id,Q.question, PMA.part_model_ans,QP.part_total_marks,MA.answer_mark
DENSE_RANK() over(Partition by QP.question_id) as number FROM "QUESTIONS" Q
LEFT JOIN "QUESTIONS_PART" QP ON QP.question_id = Q.question_id
LEFT join "PART_MODEL_ANSWER" PMA ON PMA.part_id = QP.part_id
LEFT join "MODEL_ANSWER" MA ON MA.question_id = Q.question_id
ORDER BY Q.question_id ASC
我想做的是在有唯一问题时增加计数,但在有重复问题时计数保持不变,每个问题后计数也会重置,我尝试使用密集排名但它使number
列中所有值的值为 1
我想你想要 order by
,而不是 partition by
:
DENSE_RANK() OVER (ORDER BY QP.question_id) as number
表是无序集,因此要使其正常工作,您需要一个定义行顺序的列,以便您可以按该顺序检查列 Question
的值是否更改。
我在你的示例数据中没有看到这样的列,所以我将使用 SQLite 的 rowid
.
创建一个 CTE,它将 return 列 flag
指示某行是否是新 Question
的开始。
最后使用 SUM()
window 函数得到你想要的结果:
WITH cte AS (
SELECT Q.Question_id, Q.Question, PMA.part_model_ans, QP.part_total_marks, MA.answer_mark, Q.rowid,
Q.Question <> LAG(Q.Question, 1, '') OVER (PARTITION BY Q.Question_id ORDER BY Q.rowid) flag
FROM QUESTIONS Q
LEFT JOIN QUESTIONS_PART QP ON QP.question_id = Q.question_id
LEFT JOIN PART_MODEL_ANSWER PMA ON PMA.part_id = QP.part_id
LEFT JOIN MODEL_ANSWER MA ON MA.question_id = Q.question_id
)
SELECT Question_id, Question, part_model_ans, part_total_marks, answer_mark,
SUM(flag) OVER (PARTITION BY Question_id ORDER BY rowid) number
FROM cte
ORDER BY question_id
查看简化版 demo.
您想按问题排序,这样 window 函数将区分问题(SQL Fiddle 供进一步参考):
SELECT
Question,
DENSE_RANK() OVER (ORDER BY Question) AS ranker
FROM your_data;
输出:
Question ranker
----------------- ------
"4+4" 1
"8+8" 2
"What's a dog" 3
"What's a dog" 3
"What's a potato" 4
"What's a potato" 4