SQLserver查询

问题描述,一句sql查询下图中所有字段信息。

预计完成时间查询说明:
通过前5块组件的生产时间计算出它们每一块的平均时间,每10块组件计算一次平均时间。

img

基于最新版ChatGPT4的回答,望采纳!!!有其他问题也可以询问我哦、”(最新版更智能,功能更加强大)

假设我们有一个名为 orders 的数据表,其结构如下:

  1. order_id (工单号)
  2. order_quantity (工单数量)
  3. engineer (工程师)
  4. production_start_time (工单投产时间)
  5. production_progress (生产进度)
  6. duration (工单历时)
  7. estimated_completion_time (预计完成时间)

以下是一个查询示例:

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个工单记录的预计完工时间和工单历时计算出来,并显示在每一组的第一个工单记录中。
需要根据具体的数据表结构和数据进行调整和修改。