如何在SQL Server上通过查询获得唯一行、所有列和最小最大日期时间
microsoftsqlserver中的查询如何在SQL Server上通过查询获得唯一行、所有列和最小最大日期时间,sql,sql-server,tsql,Sql,Sql Server,Tsql,microsoftsqlserver中的查询 select * from TIMEDATA1 order by [Production order] asc 我得到的数据如下: ╔══════════╤═════════════╤══════════╤═══════╤═════════════╤════════════╤══════════════════╤══════════════════════╤══════════╤═════════════╤═════╤════════════╤
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),我也编辑了我的问题。我很抱歉。我不明白你的意思。请指定此情况的查询