【问题标题】:How to get unique row, all column and min max datetime by query on SQL Server如何通过 SQL Server 上的查询获取唯一行、所有列和最小最大日期时间
【发布时间】:2020-10-09 03:23:05
【问题描述】:

在 Microsoft SQL Server 中查询

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 ║
╚══════════════════╧══════════════════════╧═════════════╧════════════╧═════════════════════════╧═════════════════════════╝

注意Production order 应该是唯一值。 PN, ProjectID, Drawing No 也应该是唯一值。可以从第一行或任何一行获取。

MIN_DATE_TIMEMIN( CAST([Start Date] AS DATETIME) + CAST([Start Time] AS DATETIME))

MAX_DATE_TIMEMAX(CAST([End Date] AS DATETIME) + CAST([End Time] AS DATETIME))

Query SQL to get all column and min max datetime by MSSQL 有类似的问题

我尝试回答结果,但是@Gordon Linoff 提到这会为每个生产订单返回多行,这是因为值不同 请帮我。谢谢!

编辑

数据类型

开始日期:日期

结束日期:日期

开始时间:时间(0)

结束时间:time(0)

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

【问题讨论】:

  • 您的表中的生产订单列显然有重复值。什么决定了独特的价值?
  • start_date/start_time 和 end_date/end_time 列的数据类型是什么?
  • @JoelCoehoorn start_date/start_time 列的数据类型是日期/时间(0)。 end_date/end_time 列也是日期/时间(0)

标签: sql sql-server tsql


【解决方案1】:

我需要知道日期和时间列的数据类型,才能知道完成最后两列的最佳方式。既然这不是问题,这里是其余的,这足以让你开始:

select [Production order]
   , MIN(PN) as PN
   , MIN(ProjectID) as ProjectID
   , MIN([Drawing No]) as [Drawing No]
from TIMEDATA1 
group by [Production order]
order by [Production order] asc

我也注意到了这一点:

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

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

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

MA-000001FAB, 2A, 2019-09-23 16:51:19.000

但是,查看绘图2A 的原始数据,我们可以看到此结束时间与该绘图无关。换句话说,这些数据并排显示没有任何意义。 您的工作是了解这一点并反对这种要求或了解如何扩展它以显示正确的行。

如果您必须满足这个糟糕的要求,最好这样做:

select *
from (
    select [Production order], PN, ProjectID, [Drawing No]
        , row_number() over (partition by [production order] order by [production order], end_date, end_time) as rn
    from TIMEDATA1 
) t1
where rn = 1
order by [production order]

这样,至少所有随机值都来自同一行,并且它将是与最小结束日期和时间匹配的行。

【讨论】:

  • 我编辑了我的问题。对不起。我不明白你的意思。请针对这种情况指定查询
【解决方案2】:

你也可以这样做-

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];

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

【讨论】:

    猜你喜欢
    • 2021-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-23
    • 2015-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多