在SQL中使用MIN或Max时如何避免分组方式

时间:2019-06-17 07:57:45

标签: sql

enter image description here

我试图仅通过使用带有设备名称的SQL Server中的MinMax函数进行先进先出和后进先出来生成报告。我的问题是,当我调用设备名称(EDailyEvents.EDevName)时,如果同一个人多次打孔,它将对同一个人显示多次。当我只需要一个条目时,先入后出。下面是我要使用的简单查询。

SELECT
    DISTINCT EDailyEvents.EPunchDate,
    EDailyEvents.EToken,
    EDailyEvents.EName,
    Emaster.EDesig,
    EDailyEvents.EDevName,
    MIN(EDailyEvents.EPunchTime) AS 'Time In',
    MAX(EDailyEvents.EPunchTime) AS 'Time Out'
FROM
    EDailyEvents
INNER JOIN EMaster ON
    EDailyEvents.EToken = EMaster.EToken
GROUP BY
    EDailyEvents.EPunchDate,
    EDailyEvents.EToken,
    EDailyEvents.EName,
    Emaster.EDesig,
    EDailyEvents.EDevName

2 个答案:

答案 0 :(得分:0)

先入

onePageOfProducts

最后,订购desc

答案 1 :(得分:0)

如果要获取其他先进/后出值,则应调整“组字段”。

在这种情况下,您将基于以下值创建组:

  • EDailyEvents.EPunchDate
  • EDailyEvents.EToken
  • EDailyEvents.EName
  • Emaster.EDesig
  • EDailyEvents.EDevName

是的,有可能存在多个具有重复值的组。您可能有多个具有相同EName值但具有不同EDevName值的组。或相反:具有相同的EDevName值,但具有不同的EName值。

如果您需要更多常规组,例如,如果您不需要特定于EToken和EName值,则应将那些“不必要的”组字段留在外面。类似于以下查询:

SELECT
    EDailyEvents.EPunchDate,
    EDailyEvents.EDevName,
    Emaster.EDesig,
    MIN(EDailyEvents.EPunchTime) AS 'Time In',
    MAX(EDailyEvents.EPunchTime) AS 'Time Out'
FROM
    EDailyEvents
INNER JOIN EMaster ON
    EDailyEvents.EToken = EMaster.EToken
GROUP BY
    EDailyEvents.EPunchDate,
    EDailyEvents.EDevName,
    Emaster.EDesig

这样,您将获得较少的组(但是,每个组中的数据更多,因此,对于诸如MIN和MAX的聚合函数,当然会导致相应的不同结果)。

另一个例子:如果您不想基于不同的令牌和不同的设备名称创建不同的组,则可以忽略这些字段。像这样:

SELECT
    EDailyEvents.EPunchDate,
    EDailyEvents.EName,
    Emaster.EDesig,
    MIN(EDailyEvents.EPunchTime) AS 'Time In',
    MAX(EDailyEvents.EPunchTime) AS 'Time Out'
FROM
    EDailyEvents
INNER JOIN EMaster ON
    EDailyEvents.EToken = EMaster.EToken
GROUP BY
    EDailyEvents.EPunchDate,
    EDailyEvents.EName,
    Emaster.EDesig

通过这些示例,我假设您现在可以轻松地创建最终结果中实际需要的组。