最小函数 select 3 列
Min Function select 3 columns
我有一个 sql 语句,我想 select 日期的最小值:
SELECT EEEV_EMPL_ID, MIN(EEEV_DT), prev
但我不想在最小值中包含上一列,但我希望在结果中包含该列。所以说我有
1 3/5/2018 UB3
1 5/28/2018 4A
其中第一列是员工编号,第二列是日期,第三列是前任。如果我这样做,两行都将被 returned 因为前一列不同。我只想 return 具有最短日期的行,而不管上一列是否不同。我该怎么做?
这是完整的声明:
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 服务器的 OPENQUERY 中使用它。
更新:
好的,所以有些人不清楚,让我试试这个:
00012662 3/5/18 2C
00012662 5/28/18 UB3
00037465 3/19/18 PA
00037465 5/28/18 UB
...
我想要这两行 returned。对于每个员工,我都想要最小日期值行。但由于第三列不同,最小日期值将 return 每行。不知道怎么问更简单
00012662 3/5/18 2C
00037465 3/19/18 PA
我不是 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
答案就在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
这个查询提供了我需要的解决方案来获得我在原始 post 中寻找的结果。
我有一个 sql 语句,我想 select 日期的最小值:
SELECT EEEV_EMPL_ID, MIN(EEEV_DT), prev
但我不想在最小值中包含上一列,但我希望在结果中包含该列。所以说我有
1 3/5/2018 UB3
1 5/28/2018 4A
其中第一列是员工编号,第二列是日期,第三列是前任。如果我这样做,两行都将被 returned 因为前一列不同。我只想 return 具有最短日期的行,而不管上一列是否不同。我该怎么做?
这是完整的声明:
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 服务器的 OPENQUERY 中使用它。
更新:
好的,所以有些人不清楚,让我试试这个:
00012662 3/5/18 2C
00012662 5/28/18 UB3
00037465 3/19/18 PA
00037465 5/28/18 UB
...
我想要这两行 returned。对于每个员工,我都想要最小日期值行。但由于第三列不同,最小日期值将 return 每行。不知道怎么问更简单
00012662 3/5/18 2C
00037465 3/19/18 PA
我不是 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
答案就在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
这个查询提供了我需要的解决方案来获得我在原始 post 中寻找的结果。