如何在SQL Server上通过查询获得唯一行、所有列和最小最大日期时间

如何在SQL Server上通过查询获得唯一行、所有列和最小最大日期时间,sql,sql-server,tsql,Sql,Sql Server,Tsql,microsoftsqlserver中的查询 select * from TIMEDATA1 order by [Production order] asc 我得到的数据如下: ╔══════════╤═════════════╤══════════╤═══════╤═════════════╤════════════╤══════════════════╤══════════════════════╤══════════╤═════════════╤═════╤════════════╤

microsoftsqlserver中的查询

select * 
from TIMEDATA1 
order by [Production order] asc
我得到的数据如下:

╔══════════╤═════════════╤══════════╤═══════╤═════════════╤════════════╤══════════════════╤══════════════════════╤══════════╤═════════════╤═════╤════════════╤════════════╤════════════╤══════════╗
║ RecordID │ ID Employee │ Resource │ Shift │ ProjectID   │ Drawing No │ Production order │ PN                   │ Quantity │ ProductName │ BNo │ Start Date │ Start Time │ End Date   │ End Time ║
╠══════════╪═════════════╪══════════╪═══════╪═════════════╪════════════╪══════════════════╪══════════════════════╪══════════╪═════════════╪═════╪════════════╪════════════╪════════════╪══════════╣
║ 60431    │ 2088        │ M-JO     │ HC    │ E195256-A01 │ 1A         │ MA-000000001     │ SHAFT-DBT-999M       │ 1        │ NULL        │ B01 │ 2020-10-05 │ 13:23:27   │ NULL       │ NULL     ║
╟──────────┼─────────────┼──────────┼───────┼─────────────┼────────────┼──────────────────┼──────────────────────┼──────────┼─────────────┼─────┼────────────┼────────────┼────────────┼──────────╢
║ 8354     │ 2029        │ M-JO     │ HC    │ E183127-A01 │ 2A         │ MA-000001FAB     │ VY1200-DISE-700F1    │ 7        │ NULL        │ B01 │ 2019-09-23 │ 09:41:48   │ 2019-09-23 │ 14:38:18 ║
╟──────────┼─────────────┼──────────┼───────┼─────────────┼────────────┼──────────────────┼──────────────────────┼──────────┼─────────────┼─────┼────────────┼────────────┼────────────┼──────────╢
║ 8408     │ 2058        │ M-MD2.5  │ 1     │ E183127-A02 │ 3A         │ MA-000001FAB     │ VY1200-DISE-700F2    │ 7        │ NULL        │ B01 │ 2019-09-23 │ 15:32:53   │ 2019-09-23 │ 16:51:19 ║
╟──────────┼─────────────┼──────────┼───────┼─────────────┼────────────┼──────────────────┼──────────────────────┼──────────┼─────────────┼─────┼────────────┼────────────┼────────────┼──────────╢
║ 50130    │ 2175        │ M-ML1.5  │ HC    │ L190004-A01 │ 4A         │ MA-000001PHA     │ L190004-A01-051-023C │ 2        │ NULL        │ B01 │ 2020-05-19 │ 15:59:23   │ 2020-05-19 │ 18:06:14 ║
╟──────────┼─────────────┼──────────┼───────┼─────────────┼────────────┼──────────────────┼──────────────────────┼──────────┼─────────────┼─────┼────────────┼────────────┼────────────┼──────────╢
║ 50231    │ 2175        │ M-ML1.5  │ HC    │ L190004-A02 │ 4B         │ MA-000001PHA     │ L190004-A01-051-023C │ 2        │ NULL        │ B01 │ 2020-05-20 │ 08:04:39   │ 2020-05-20 │ 16:53:53 ║
╟──────────┼─────────────┼──────────┼───────┼─────────────┼────────────┼──────────────────┼──────────────────────┼──────────┼─────────────┼─────┼────────────┼────────────┼────────────┼──────────╢
║ 50874    │ 2134        │ M-ML2    │ HC    │ L190004-A07 │ 5C         │ MA-000002PHA     │ L190004-A01-005-023C │ 2        │ NULL        │ B01 │ 2020-05-22 │ 10:11:08   │ 2020-05-22 │ 16:39:43 ║
╟──────────┼─────────────┼──────────┼───────┼─────────────┼────────────┼──────────────────┼──────────────────────┼──────────┼─────────────┼─────┼────────────┼────────────┼────────────┼──────────╢
║ 51030    │ 2134        │ M-ML2    │ HC    │ L190004-A08 │ 5C         │ MA-000002PHA     │ L190004-A01-005-023C │ 2        │ NULL        │ B01 │ 2020-05-23 │ 08:06:43   │ 2020-05-23 │ 11:38:03 ║
╟──────────┼─────────────┼──────────┼───────┼─────────────┼────────────┼──────────────────┼──────────────────────┼──────────┼─────────────┼─────┼────────────┼────────────┼────────────┼──────────╢
║ 52063    │ 2134        │ M-ML2    │ HC    │ E203089-A05 │ 2AW        │ MA-000003PHA     │ E203089-A01-005-023C │ 1        │ NULL        │ B01 │ 2020-05-28 │ 13:23:48   │ 2020-05-28 │ 18:29:19 ║
╟──────────┼─────────────┼──────────┼───────┼─────────────┼────────────┼──────────────────┼──────────────────────┼──────────┼─────────────┼─────┼────────────┼────────────┼────────────┼──────────╢
║ 52204    │ 2134        │ M-ML2    │ HC    │ E203089-A01 │ 1A         │ MA-000003PHA     │ E203089-A01-005-023C │ 1        │ NULL        │ B01 │ 2020-05-29 │ 08:05:22   │ 2020-05-29 │ 12:51:25 ║
╟──────────┼─────────────┼──────────┼───────┼─────────────┼────────────┼──────────────────┼──────────────────────┼──────────┼─────────────┼─────┼────────────┼────────────┼────────────┼──────────╢
║ 8051     │ 2163        │ M-MLV1.6 │ 3     │ E183116-A03 │ Q          │ MA-000005198     │ VY0750031-SUCB-819M1 │ 1        │ NULL        │ B01 │ 2019-09-21 │ 02:30:14   │ 2019-09-21 │ 06:00:00 ║
╟──────────┼─────────────┼──────────┼───────┼─────────────┼────────────┼──────────────────┼──────────────────────┼──────────┼─────────────┼─────┼────────────┼────────────┼────────────┼──────────╢
║ 8052     │ 2028        │ M-MLV1.6 │ 1     │ E183116-A02 │ P          │ MA-000005198     │ VY0750031-SUCB-819M  │ 1        │ NULL        │ B01 │ 2019-09-21 │ 08:10:59   │ 2019-09-21 │ 10:00:00 ║
╟──────────┼─────────────┼──────────┼───────┼─────────────┼────────────┼──────────────────┼──────────────────────┼──────────┼─────────────┼─────┼────────────┼────────────┼────────────┼──────────╢
║ 8100     │ 2029        │ M-JO     │ 2     │ E183116-A03 │ X          │ MA-000005198     │ VY0750031-SUCB-819M  │ 1        │ NULL        │ B01 │ 2019-09-21 │ 14:05:12   │ 2019-09-21 │ 15:36:38 ║
╚══════════╧═════════════╧══════════╧═══════╧═════════════╧════════════╧══════════════════╧══════════════════════╧══════════╧═════════════╧═════╧════════════╧════════════╧════════════╧══════════╝
我试着询问

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;
但是,它会为每个生产订单返回多行。 我希望查询表为

╔══════════════════╤══════════════════════╤═════════════╤════════════╤═════════════════════════╤═════════════════════════╗
║ Production order │ PN                   │ ProjectID   │ Drawing No │ MIN_DATE_TIME           │ MAX_DATE_TIME           ║
╠══════════════════╪══════════════════════╪═════════════╪════════════╪═════════════════════════╪═════════════════════════╣
║ MA-000000001     │ SHAFT-DBT-999M       │ E195256-A01 │ 1A         │ 2020-10-05 13:23:27.000 │ NULL                    ║
╟──────────────────┼──────────────────────┼─────────────┼────────────┼─────────────────────────┼─────────────────────────╢
║ MA-000001FAB     │ VY1200-DISE-700F1    │ E183127-A01 │ 2A         │ 2019-09-23 09:41:48.000 │ 2019-09-23 16:51:19.000 ║
╟──────────────────┼──────────────────────┼─────────────┼────────────┼─────────────────────────┼─────────────────────────╢
║ MA-000001PHA     │ L190004-A01-051-023C │ L190004-A01 │ 4A         │ 2020-05-19 15:59:23.000 │ 2020-05-20 16:53:53.000 ║
╟──────────────────┼──────────────────────┼─────────────┼────────────┼─────────────────────────┼─────────────────────────╢
║ MA-000002PHA     │ L190004-A01-005-023C │ L190004-A07 │ 5C         │ 2020-05-22 10:11:08.000 │ 2020-05-23 11:38:03.000 ║
╟──────────────────┼──────────────────────┼─────────────┼────────────┼─────────────────────────┼─────────────────────────╢
║ MA-000003PHA     │ E203089-A01-005-023C │ E203089-A01 │ 2AW        │ 2020-05-28 13:23:48.000 │ 2020-05-29 12:51:25.000 ║
╟──────────────────┼──────────────────────┼─────────────┼────────────┼─────────────────────────┼─────────────────────────╢
║ MA-000005198     │ VY0750031-SUCB-819M1 │ E183116-A03 │ Q          │ 2019-09-21 02:30:14.000 │ 2019-10-21 15:36:38.000 ║
╚══════════════════╧══════════════════════╧═════════════╧════════════╧═════════════════════════╧═════════════════════════╝
注意
生产订单
应为唯一值<代码>PN、ProjectID、图纸编号也应该是唯一的值。可以从第一行或任意行获取

MIN\u DATE\u TIME
MIN(转换([Start DATE]为DATETIME)+转换([Start TIME]为DATETIME))

MAX\u DATE\u TIME
MAX(CAST([End DATE]AS DATETIME)+CAST([End TIME]AS DATETIME))

我有一个类似的问题

我尝试使用answer的结果,但是@Gordon Linoff提到这会在每个生产订单中返回多行,这是因为值不同 请帮帮我。谢谢大家!

编辑

数据类型

开始日期:日期

结束日期:日期

开始时间:时间(0)

结束时间:时间(0)


我知道这份报告的设计很差。但我这样做是为了其他目的

我需要知道日期和时间列的数据类型,以便知道完成最后两列的最佳方法。既然这不在问题中,下面是剩下的部分,足以让您开始:

选择[生产订单]
,最小值(PN)为PN
,MIN(projectd)作为projectd
,最小([图纸编号])为[图纸编号]
从时间数据1
分组依据[生产订单]
按[生产订单]asc订购

我还注意到:

PN、ProjectID、Drawing No也应该是唯一的值。可以从第一行或任意行获取

这也是一个常见的要求,但它的报告设计非常糟糕,因为它很容易最终显示没有意义的数据

例如,查看示例结果数据,我们可以看到生产订单、图纸和结束时间的以下值:

MA-000001FAB, 2A, 2019-09-23 16:51:19.000
这样,至少所有随机值都将来自同一行,并且将是与最小结束日期和时间匹配的行。

您也可以执行以下操作-

Select 
     [Production order],
     min(PN) As PN,
     min(ProjectID) As ProjectID,
     min(Drawing_No) As Drawing_No,
     min(Start_datetime) As Start_datetime,
     max(End_datetime) As End_datetime
from     
(Select [Production order]
      ,FIRST_VALUE([PN]) OVER (PARTITION BY [Production order] ORDER BY Start_datetime) As PN
      ,FIRST_VALUE([ProjectID]) OVER (PARTITION BY [Production order] ORDER BY Start_datetime) As ProjectID
      ,FIRST_VALUE([Drawing No]) OVER (PARTITION BY [Production order] ORDER BY Start_datetime) As Drawing_No
      ,Start_datetime As Start_datetime
      ,End_datetime As End_datetime
from
(select  t.*,
         CAST([start date] as DATETIME) + CAST([start time] as DATETIME) As Start_datetime,
         CAST([end date] as DATETIME) + CAST([end time] as DATETIME) As End_datetime
 from TIMEDATA1 t) Tab ) Tab2
group by 
[Production order];

在这种方法中,您只需在非分组列上应用第一个_值分析函数,以获得它们相对于min start_datetime的对应值,然后通过在该列上分组来聚合,以获得最终输出。假定日期和时间字段为字符串格式,因此类型转换为datetime。如果您的字段已经是日期和时间格式,您只需进行合并,在这种情况下就不需要进行类型转换。

您的表中的“生产订单”列显然有重复的值。什么决定了唯一值?开始日期/开始时间和结束日期/结束时间列的数据类型是什么?@JoelCoehoorn开始日期/开始时间列的数据类型是日期/时间(0)。结束日期/结束时间列是日期/时间(0),我也编辑了我的问题。我很抱歉。我不明白你的意思。请指定此情况的查询