问题描述,一句sql查询下图中所有字段信息。
预计完成时间查询说明:
通过前5块组件的生产时间计算出它们每一块的平均时间,每10块组件计算一次平均时间。
基于最新版ChatGPT4的回答,望采纳!!!有其他问题也可以询问我哦、”(最新版更智能,功能更加强大)
假设我们有一个名为 orders
的数据表,其结构如下:
以下是一个查询示例:
WITH order_avg_time AS (
SELECT
order_id,
order_quantity,
engineer,
production_start_time,
production_progress,
duration,
SUM(duration) OVER (PARTITION BY engineer ORDER BY production_start_time ROWS BETWEEN 4 PRECEDING AND CURRENT ROW) / 5.0 AS avg_time
FROM
orders
),
order_avg_time_every_10 AS (
SELECT
*,
ROW_NUMBER() OVER (PARTITION BY engineer ORDER BY production_start_time) AS row_num
FROM
order_avg_time
)
UPDATE orders
SET estimated_completion_time = new_estimated_completion_time.new_value
FROM (
SELECT
order_avg_time_every_10.order_id,
CASE
WHEN row_num % 10 = 0 THEN avg_time * (order_quantity - production_progress)
ELSE estimated_completion_time
END AS new_value
FROM
order_avg_time_every_10
) AS new_estimated_completion_time
WHERE
orders.order_id = new_estimated_completion_time.order_id;
这个查询首先使用一个名为 order_avg_time
的CTE (公共表表达式) 计算每个工程师的前5块组件的生产时间平均值。然后,它使用名为 order_avg_time_every_10
的第二个CTE 为每个工程师的工单添加一个行号。
接下来,查询更新 orders
表的 estimated_completion_time
字段。当行号(row_num
)是10的倍数时,将平均时间乘以剩余的组件数量(order_quantity - production_progress
)以计算新的预计完成时间。在其他情况下,保持 estimated_completion_time
字段的当前值不变。
请注意,此查询将更新表中的 estimated_completion_time
字段,而不是仅在查询结果中显示新值。根据您的需求,这可能是您要执行的操作。如果您只希望在查询结果中查看预计完成时间而不更新表,请使用SELECT语句替换UPDATE语句。
可详细沟通下, 可以提供下测试数据和结果数据, 这样才能更好的理解你的需求, 然后写的SQL才能符合你的要求
建议补充下模拟数据和想要的结果。
以下回答引自chatgpt
以下是可以查询给定字段信息的 SQL 语句,其中使用了子查询计算每10块组件的平均时间并将其用于计算预计完成时间。
SELECT
work_order_number,
work_order_quantity,
engineer,
work_order_start_time,
production_progress,
work_order_duration,
DATEADD(second, avg_block_time * (work_order_quantity / 10), work_order_start_time) AS expected_completion_time
FROM
(
SELECT
work_order_number,
work_order_quantity,
engineer,
work_order_start_time,
production_progress,
work_order_duration,
AVG(block_duration) AS avg_block_time
FROM
(
SELECT
work_order_number,
work_order_quantity,
engineer,
work_order_start_time,
production_progress,
work_order_duration,
block_number,
DATEDIFF(second, LAG(block_end_time) OVER (PARTITION BY work_order_number ORDER BY block_number), block_end_time) AS block_duration
FROM
table_name
) AS blocks
WHERE
block_number % 10 = 0
GROUP BY
work_order_number,
work_order_quantity,
engineer,
work_order_start_time,
production_progress,
work_order_duration
) AS avg_times
请注意,您需要将 table_name 替换为包含您的数据的实际表名。另外,此查询假定每个块都具有唯一的 block_number,并且查询使用了 LAG 窗口函数来计算每个块的持续时间。您需要根据实际情况进行调整。
参考GPT和自己的思路:由于没有具体的数据表结构和数据,以下代码仅提供一个大致的思路,需要根据实际情况进行修改:
WITH cte AS (
SELECT 工单号, 工单数量, 工程师, 工单投产时间, 生产进度,
DATEDIFF(day, 工单投产时间, GETDATE()) AS 工单历时,
DATEADD(day, 生产进度 / (SELECT AVG(生产进度) FROM 工单表), 工单投产时间) AS 预计完工时间,
ROW_NUMBER() OVER (ORDER BY 工单投产时间) AS rn
FROM 工单表
)
SELECT c1.*, c2.预计完工时间 AS 下一组预计完工时间, c2.工单历时 AS 下一组工单历时
FROM cte c1
LEFT JOIN cte c2 ON c1.rn / 10 * 10 + 10 = c2.rn
该SQL语句使用了CTE(公共表表达式)和窗口函数的功能,其中:
使用CTE将工单表中的每个工单记录的工单历时和预计完工时间计算出来,并使用ROW_NUMBER()窗口函数为每个工单记录编号,便于后续计算;
在主查询中使用LEFT JOIN将每组10个工单记录的预计完工时间和工单历时计算出来,并显示在每一组的第一个工单记录中。
需要根据具体的数据表结构和数据进行调整和修改。