查询SQL以通过MSSQL获取所有列和最小最大日期时间

查询SQL以通过MSSQL获取所有列和最小最大日期时间,sql,sql-server,tsql,select,unique,Sql,Sql Server,Tsql,Select,Unique,我正在使用Microsoft SQL Server。这是我的桌子 添加了示例数据格式文本作为表 我试图获得唯一的生产订单、最小开始日期、开始时间、最大结束日期和结束时间,如 SELECT [Production order], MIN( CAST([Start Date] AS DATETIME) + CAST([Start Time] AS DATETIME)) AS MIN_DATE_TIME, MAX(CAST([End Date] AS DATETIME) + CAS

我正在使用Microsoft SQL Server。这是我的桌子 添加了示例数据格式文本作为表

我试图获得唯一的生产订单、最小开始日期、开始时间、最大结束日期和结束时间,如

SELECT
        [Production order], MIN( CAST([Start Date] AS DATETIME) + CAST([Start Time] AS DATETIME))   AS MIN_DATE_TIME, MAX(CAST([End Date] AS DATETIME) + CAST([End Time] AS DATETIME)) AS MAX_DATE_TIME
    FROM
        TIMEDATA1
    WHERE RESOURCE not like 'I-%'
    GROUP BY
        [Production order]
    order by 
        [Production order] ASC
但是,只有生产订单、最小日期时间、最大日期时间列。我可以质疑。 我试着询问

   SELECT
   distinct [Production order] ,PN, ProjectID,[Drawing No], MIN( CAST([Start Date] AS DATETIME) + CAST([Start Time] AS DATETIME))   AS MIN_DATE_TIME, MAX(CAST([End Date] AS DATETIME) + CAST([End Time] AS DATETIME)) AS MAX_DATE_TIME
FROM
    TIMEDATA1
WHERE RESOURCE not like 'I-%'
GROUP BY
    [Production order]
order by 
    [Production order] ASC
它显示了这样的错误

我希望得到更多的列,如PN、ProjectID、图纸编号


请帮帮我,非常感谢

将第一个结果放入CTE或子查询中,并连接回主表:

;with MinMax as (
SELECT
   [Production order], MIN( CAST([Start Date] AS DATETIME) + CAST([Start Time] AS 
DATETIME))   AS MIN_DATE_TIME, MAX(CAST([End Date] AS DATETIME) + CAST([End Time] AS 
DATETIME)) AS MAX_DATE_TIME
    FROM
        TIMEDATA1
    WHERE RESOURCE not like 'I-%'
    GROUP BY
        [Production order]
    order by 
        [Production order] ASC
)
SELECT TD.*, MM.Min_Date_Time, MM.Max_Date_Time
FROM TIMEDATA1 TD 
      INNER JOIN MinMax MM on MM.[Production order] = TD.[Production order]
);以MinMax为例 选择 [Production order],MIN CAST[Start Date]作为DATETIME+CAST[Start Time]作为DATETIME作为MIN_Date_Time,MAXCAST[End Date]作为DATETIME+CAST[End Time]作为DATETIME作为MAX_Date_Time 从…起 时间数据1 其中资源不象'I-%' 分组 [生产订单] 订购人 [生产订单]ASC 选择TD.*、MM.Min\u日期时间、MM.Max\u日期时间 从TIMEDATA1 TD
在MM.[Production order]=TD.[Production order]

上将第一个结果放入CTE或子查询中,并连接回主表:

;with MinMax as (
SELECT
   [Production order], MIN( CAST([Start Date] AS DATETIME) + CAST([Start Time] AS 
DATETIME))   AS MIN_DATE_TIME, MAX(CAST([End Date] AS DATETIME) + CAST([End Time] AS 
DATETIME)) AS MAX_DATE_TIME
    FROM
        TIMEDATA1
    WHERE RESOURCE not like 'I-%'
    GROUP BY
        [Production order]
    order by 
        [Production order] ASC
)
SELECT TD.*, MM.Min_Date_Time, MM.Max_Date_Time
FROM TIMEDATA1 TD 
      INNER JOIN MinMax MM on MM.[Production order] = TD.[Production order]

通过以下方式在组中包括其他列:

所有非聚合列都应位于GROUP BY中


如果每个生产订单返回多行,那是因为值不同。您需要指定在这种情况下要执行的操作。如果这是一个问题,我建议您提出一个新的问题,提供样本数据、期望的结果,并清楚地解释要做什么。数据应该是文本表而不是图像。

您必须在查询中显式选择它们。。。目前,仅选择提及的生产订单、最小日期时间和最大日期时间。将所需的其他内容添加到SELECT子句中。如果你想要唯一的值,你可能想要选择不同的值。数据的图像真的帮不了我们。花时间以可消费的格式发布样本数据;最好是DDL和DML,如果不是,则使用表格格式文本。您通常按照与所选相同的列进行分组,但作为设置函数参数的列除外。在执行分组方式时,您很少需要执行“选择不同”,因为分组方式消除了重复项。@jarlh请清楚地帮助或回答,谢谢!谢谢你的帮助和提示。我问了一个新问题:。请帮忙
SELECT [Production order], PN, ProjectID,[ Drawing No],
       MIN( CAST([Start Date] AS DATETIME) + CAST([Start Time] AS DATETIME)) AS MIN_DATE_TIME,
       MAX(CAST([End Date] AS DATETIME) + CAST([End Time] AS DATETIME)) AS MAX_DATE_TIME
FROM TIMEDATA1
WHERE RESOURCE not like 'I-%'
GROUP BY [Production order], PN, ProjectID,[ Drawing No]
ORDER BY [Production order] ASC;