【问题标题】:I can't do a school assignment. SQLite Help Needed我不能做学校作业。需要 SQLite 帮助
【发布时间】:2021-04-15 15:46:27
【问题描述】:

测试表包含某型火箭发动机的功率测试数据。以下列中的值表示:

ID - test number
SN - engine serial number
T - test duration in seconds
M1, M2, M3 - power values ​​recorded at the beginning, half and end of the test duration.

您的任务是为每台发动机显示其在三个功率测量中达到最高平均值的测试。但是,您必须考虑以下限制: 1.我们只对参加过至少 5 次测试的引擎感兴趣, 2.对于满足条件 1 的引擎的测试,我们只对持续时间为至少一分钟,并且三个测量值的最小值不小于三个测量值的最大值的 90% 3. 我们只对在满足第 2 点标准后选择的测试满足以下条件的发动机感兴趣条件:给定发动机的三个测试测量结果的最低平均值不低于这些测试中最高测量平均值的 85%。

结果表应包含四列:

ID
SN
MAX - containing the highest value of the three measurements in the given test
MAX_AVG - containing the highest average of measurements from all tests for a given engine (taking into account the conditions described above). Round this value to two decimal places.
Sort the results from the highest to the lowest average.

我是一名学生,教授在下面给了我这样的作业,我正在发送我的想法来解决这个问题。

SELECT
  ID, SN, AS MAX(M1, M2, M3) AS MAX, ROUND(MAX((M1 + M2 + M3)/3.0),2) AS MAX_AVG
FROM
  tests
WHERE
      T >= 60
  AND MIN(M1, M2, M3) >= MAX(M1, M2, M3) * 0.9
GROUP BY
  SN
HAVING
      COUNT(SN) >= 5
  AND MIN((M1 + M2 + M3)/3.0) >= MAX((M1 + M2 + M3)/3.0) * 0.85
ORDER BY
  MAX_AVG ASC;

【问题讨论】:

  • 您从查询中得到了什么结果?它们与您想要的有何不同?

标签: sql sqlite


【解决方案1】:

你没有说你的困难是什么。但是您确实包含了您的尝试,并且做出了努力。

但是,你有一个倒退的条件,所以可能就是这样。

假设您有一个引擎参加了 5 次测试,但第五次只持续了 55 秒。条件 1 表示您必须包含该引擎,因为它确实参与了五项测试:

1.我们只对参与过至少 5 次测试的引擎感兴趣

当然,对于那个引擎,您只需要前四个测试:

2.在满足条件 1 的引擎测试中,我们只对持续至少一分钟的引擎感兴趣

但是您的 WHERE 从一开始就排除了第五个测试,因此剩下四个,而 HAVING 排除了该引擎。

您可能想尝试使用 subSELECT 来处理这种情况。

【讨论】:

  • 我正在使用一个站点,该站点生成作业以在 sqlite 引擎上解决。查询应遵循命令,但是当我键入查询时,它会显示一条记录和一条消息,表明作业未正确完成。你认为这个问题的解决方案是什么,或者你会如何使用 subSELECT
  • 您需要将架构和示例数据添加到您的问题中。当然还有预期的结果。否则,目前的问题对除了你之外的任何人都没有真正的用处——而这并不是 SO 的全部意义所在。
【解决方案2】:
WITH
  test_level_summary AS
(
  SELECT
    ID,
    SN,
    MIN(M1, M2, M3)                   AS MIN_M,
    MAX(M1, M2, M3)                   AS MAX_M,
    ROUND((M1 + M2 + M3)/3.0), 2)     AS AVG_M,
    COUNT(*) OVER (PARTITION BY SN)   AS SN_TEST_COUNT
  FROM
    tests
),
    valid_engines AS
(
  SELECT
    *,
    MIN(AVG_M) OVER (PARTITION BY SN)   AS MIN_AVG_M,
    MAX(AVG_M) OVER (PARTITION BY SN)   AS MAX_AVG_M
  FROM
    test_level_summary
  WHERE
        SN_TEST_COUNT >= 5
    AND T >= 60
    AND MIN_M >= MAX_M * 0.9
)
SELECT
  ID, SN, MAX_M, AVG_M
FROM
  valid_engines
WHERE
      MIN_AVG_M >= MAX_AVG_M * 0.85
  AND     AVG_M  = MAX_AVG_M

【讨论】:

  • 这里的主要区别是 MIN_AVG_M 和 MAX_AVG_M(用于您问题中的约束 3)仅在应用约束 2 之后计算,因此从所述计算中排除了一些测试。
  • 哦,测试中具有最高 AVG_M 的 MAX_M 不一定是 MAX(MAX_M)。例如,如果一个测试的 M 为 100,101,102,而另一个测试的 M 为 100,100,103……那么第一个测试的 AVG 最高,但它的 MAX_M 不等于 MAX(MAX_M)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-09-26
  • 2023-04-08
  • 2023-03-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-12
相关资源
最近更新 更多