如何在 sqlite 中过滤 SUM(flag) OVER (...)
How to filter SUM(flag) OVER (...) with having in sqlite
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) part
FROM cte
having part = 1
ORDER BY question_id
我想做的是过滤部分,以便它只显示其中包含 1 的行
然而,在使用 having part == 1 之后,预期结果仍然相同我不知道为什么它不过滤,where 子句由于滥用聚合
而无法使用
您需要将条件放在 WHERE
子句中,但是 part
是 window 函数的结果,您不能直接在 [=11] 中使用它=] 子句。
您可以使用子查询来完成:
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 *
FROM (
SELECT Question_id, Question, part_model_ans, part_total_marks, answer_mark,
SUM(flag) OVER (PARTITION BY Question_id ORDER BY rowid) part
FROM cte
)
WHERE part = 1
ORDER BY question_id
我猜您想要每个 Question_Id
的第一个问题。如果题目不重复,那么更简单的方法是:
WITH cte AS (
SELECT Q.Question_id, Q.Question, PMA.part_model_ans, QP.part_total_marks, MA.answer_mark, Q.rowid,
FIRST_VALUE(Q.Question) OVER (PARTITION BY Q.Question_id ORDER BY Q.rowid) as first_question
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
FROM cte
WHERE Question = first_question
ORDER BY question_id;
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) part
FROM cte
having part = 1
ORDER BY question_id
我想做的是过滤部分,以便它只显示其中包含 1 的行 然而,在使用 having part == 1 之后,预期结果仍然相同我不知道为什么它不过滤,where 子句由于滥用聚合
而无法使用您需要将条件放在 WHERE
子句中,但是 part
是 window 函数的结果,您不能直接在 [=11] 中使用它=] 子句。
您可以使用子查询来完成:
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 *
FROM (
SELECT Question_id, Question, part_model_ans, part_total_marks, answer_mark,
SUM(flag) OVER (PARTITION BY Question_id ORDER BY rowid) part
FROM cte
)
WHERE part = 1
ORDER BY question_id
我猜您想要每个 Question_Id
的第一个问题。如果题目不重复,那么更简单的方法是:
WITH cte AS (
SELECT Q.Question_id, Q.Question, PMA.part_model_ans, QP.part_total_marks, MA.answer_mark, Q.rowid,
FIRST_VALUE(Q.Question) OVER (PARTITION BY Q.Question_id ORDER BY Q.rowid) as first_question
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
FROM cte
WHERE Question = first_question
ORDER BY question_id;