【问题标题】:Min Function select 3 columns最小功能选择 3 列
【发布时间】:2019-03-15 15:13:26
【问题描述】:

我有一个 sql 语句,我想在其中选择日期的最小值:

SELECT EEEV_EMPL_ID, MIN(EEEV_DT), prev

但我不想在 min 中包含 prev 列,但我希望在结果中包含该列。所以说我有

1   3/5/2018    UB3 
1   5/28/2018   4A

其中第一列是员工 ID,第二列是日期,第三列是 prev。如果我这样做,将返回两行,因为 prev 列不同。我只想返回具有最小日期的行,而不管上一列是否不同。我该怎么做?

这是完整的声明:

SELECT EEEV_EMPL_ID, EEEV_DT, prev
FROM (
       SELECT EEEV_EMPL_ID, EEEV_DT, EEEV_CCTR_ID,LAG(EEEV_CCTR_ID)          
              OVER(ORDER BY EEEV_EMPL_ID DESC, EEEV_DT DESC) AS prev      
       FROM CDAS.VDWHEEEV1 eeev1 
       WHERE extract(year from eeev1.eeev_dt) = 
             (select extract(year from sysdate) from dual) 
       ORDER BY EEEV_EMPL_ID
     ) x
GROUP BY EEEV_EMPL_ID, prev
ORDER BY EEEV_EMPL_ID

这是一个 oracle 查询,但我将在 sql server 的 OPENQUERY 中使用它。

更新:

好的,所以有些人不清楚,让我试试这个:

00012662    3/5/18     2C
00012662    5/28/18    UB3
00037465    3/19/18    PA
00037465    5/28/18    UB
...

我想要返回这两行。对于每个员工,我想要最小日期值行。但是因为第三列不同,所以最小日期值会返回每一行。不知道如何更简单地问它。

00012662    3/5/18     2C
00037465    3/19/18    PA

【问题讨论】:

  • 答案从here开始
  • 想象这个问题不是你的,阅读它并尝试理解它并回答它。可以吗?
  • 我读过,对我来说很有意义。我无法回答它,因为我是那个问它的人。
  • 我认为没有人能理解例如这部分:但我不想在 min 中包含 prev 列,但我希望在结果中包含该列, mybe 示例数据和预期结果将是最好的解释。
  • @dk96m 当然你可以在这里回答你自己的问题。这将不胜感激。

标签: sql sql-server oracle openquery


【解决方案1】:

我不是 100% 确定你想要什么,因为不清楚,但我的猜测是这样的。

SELECT *
FROM 
    (
      SELECT EEEV_EMPL_ID, 
             EEEV_DT, 
             prev, 
             ROW_NUMBER() OVER(PARTITION BY EEEV_EMPL_ID ORDER BY EEEV_DT) theRow
      FROM CDAS.VDWHEEEV1 eeev1 
      WHERE extract(year from eeev1.eeev_dt) = (SELECT EXTRACT(YEAR FROM SYSDATE) FROM dual) 
    ) a
WHERE theRow = 1

【讨论】:

  • 想评论为什么投反对票?查询将执行 OP 想要的操作。
【解决方案2】:

答案在于 LAG 函数。

SELECT
      EEEV_EMPL_ID, 
      EEEV_DT, 
      EEEV_CCTR_ID, 
      LAG(EEEV_CCTR_ID, 1, ' ') OVER(PARTITION BY EEEV_EMPL_ID ORDER BY EEEV_EMPL_ID    DESC, EEEV_END_DT ASC) AS prev
FROM    
      CDAS.VDWHEEEV1 eeev1

使用滞后功能,您可以对数据进行分区,因此仅基于您希望的列。最终查询如下:

SELECT 
        EEEV_EMPL_ID, 
        EEEV_DT, 
        EEEV_CCTR_ID, 
        prev
FROM
        (
            SELECT 
                    EEEV_EMPL_ID, 
                    EEEV_DT, 
                    MIN(EEEV_DT) OVER(PARTITION BY EEEV_EMPL_ID) AS EEEV_DT1, 
                    EEEV_CCTR_ID, 
                    prev
            FROM 
                (
                        SELECT
                                EEEV_EMPL_ID, 
                                EEEV_DT, 
                                EEEV_CCTR_ID, 
                                LAG(EEEV_CCTR_ID, 1, ' ') OVER(PARTITION BY EEEV_EMPL_ID ORDER BY EEEV_EMPL_ID DESC, EEEV_END_DT ASC) AS prev
                        FROM    
                                CDAS.VDWHEEEV1 eeev1
                        ORDER BY 
                                EEEV_EMPL_ID
                ) x
            WHERE 
                    extract(year from eeev_dt) = (select extract(year from sysdate) from dual) AND
                    EEEV_CCTR_ID IN (@cctrlst)
            ORDER BY
                    EEEV_EMPL_ID
        )
WHERE EEEV_DT = EEEV_DT1
ORDER BY
        EEEV_EMPL_ID

这个查询提供了我需要的解决方案来获得我在原始帖子中寻找的结果。

【讨论】:

    猜你喜欢
    • 2012-02-04
    • 2019-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多