如何在 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;