通过另一列获取最大日期
Get Max date by another column
我正在尝试编写一个简单的查询来获取每个 INV_CART_ID 的 MAX DEMAND_DATE。这是我现有的查询:
SELECT BUSINESS_UNIT, INV_CART_ID, INV_ITEM_ID, CART_COUNT_QTY, DEMAND_DATE
FROM PS_CART_CT_INF_INV A
WHERE A.INV_ITEM_ID = 1
AND A.BUSINESS_UNIT = '11MMS'
AND A.CART_COUNT_QTY <> 0
ORDER BY DEMAND_DATE DESC
当前输出:
期望输出:
BUSINESS_UNIT INV_CART_ID INV_ITEM_ID CART_COUNT_QTY DEMAND_DATE
11MMS 405 1 5.0000 2018-05-29
11MMS OUTPT_INFUSION 1 4.0000 2018-05-29
11MMS 938 1 15.0000 2018-05-31
11MMS 286 1 1.0000 2018-05-07
11MMS 708 1 4.0000 2018-04-05
这是我到目前为止尝试做的事情:
SELECT MAX(DEMAND_DATE) AS DEMAND_DATE, INV_CART_ID, BUSINESS_UNIT,
INV_ITEM_ID, CART_COUNT_QTY
FROM PS_CART_CT_INF_INV A
WHERE A.INV_ITEM_ID = 1
AND A.BUSINESS_UNIT = '11MMS'
AND A.CART_COUNT_QTY <> 0
AND A.DEMAND_DATE IN (SELECT MAX (DEMAND_DATE) FROM PS_CART_CT_INF_INV B
WHERE A.INV_ITEM_ID = B.INV_ITEM_ID GROUP BY INV_CART_ID)
GROUP BY INV_CART_ID, BUSINESS_UNIT, INV_ITEM_ID, CART_COUNT_QTY
然而它并没有return所有INV_CART_ID #'s并且没有检索到正确的行(错误的DEMAND_DATE):
使用ROW_NUMBER
:
WITH cte AS (
SELECT BUSINESS_UNIT, INV_CART_ID, INV_ITEM_ID, CART_COUNT_QTY, DEMAND_DATE,
ROW_NUMBER() OVER (PARTITION BY INV_CART_ID ORDER BY DEMAND_DATE DESC) rn
FROM PS_CART_CT_INF_INV
WHERE
INV_ITEM_ID = 1 AND
BUSINESS_UNIT = '11MMS' AND
CART_COUNT_QTY <> 0
)
SELECT
BUSINESS_UNIT, INV_CART_ID, INV_ITEM_ID, CART_COUNT_QTY, DEMAND_DATE
FROM cte
WHERE rn = 1
ORDER BY DEMAND_DATE DESC;
如果你不想用解析函数,那我还是不会用你现在的方法。相反,我会像这样加入一个子查询:
SELECT
t1.BUSINESS_UNIT,
t1.INV_CART_ID,
t1.INV_ITEM_ID,
t1.CART_COUNT_QTY,
t1.DEMAND_DATE
FROM PS_CART_CT_INF_INV t1
INNER JOIN
(
SELECT INV_CART_ID, MAX(DEMAND_DATE) AS MAX_DEMAND_DATE
FROM PS_CART_CT_INF_INV
WHERE INV_ITEM_ID = 1 AND BUSINESS_UNIT = '11MMS' AND CART_COUNT_QTY <> 0
GROUP BY INV_CART_ID
) t2
ON t1.INV_CART_ID = t2.INV_CART_ID AND t1.DEMAND_DATE = t2.MAX_DEMAND_DATE
WHERE
t1.INV_ITEM_ID = 1 AND
t1.BUSINESS_UNIT = '11MMS' AND
t1.CART_COUNT_QTY <> 0;
您当前查询的问题(即使已更正)是它在 WHERE
子句中使用了相关子查询。这些已知是潜在的性能杀手,因此应尽可能避免。
我想你想要:
SELECT BUSINESS_UNIT, INV_CART_ID, INV_ITEM_ID, CART_COUNT_QTY, DEMAND_DATE
FROM PS_CART_CT_INF_INV AS a
WHERE INV_ITEM_ID = 1 AND BUSINESS_UNIT = '11MMS' AND
CART_COUNT_QTY <> 0 AND
DEMAND_DATE = (SELECT MAX(b.DEMAND_DATE)
FROM PS_CART_CT_INF_INV as b
WHERE a.INV_CART_ID = b.INV_CART_ID
);
但是,这会给你重复的记录,如果你想避免重复,那么你可以在 WHERE
子句中使用 identity
列或 pk
代替:
. . .
WHERE pk = (SELECT TOP (1) b.pk
FROM PS_CART_CT_INF_INV as b
WHERE a.INV_CART_ID = b.INV_CART_ID
ORDER BY b.DEMAND_DATE DESC
);
我正在尝试编写一个简单的查询来获取每个 INV_CART_ID 的 MAX DEMAND_DATE。这是我现有的查询:
SELECT BUSINESS_UNIT, INV_CART_ID, INV_ITEM_ID, CART_COUNT_QTY, DEMAND_DATE
FROM PS_CART_CT_INF_INV A
WHERE A.INV_ITEM_ID = 1
AND A.BUSINESS_UNIT = '11MMS'
AND A.CART_COUNT_QTY <> 0
ORDER BY DEMAND_DATE DESC
当前输出:
期望输出:
BUSINESS_UNIT INV_CART_ID INV_ITEM_ID CART_COUNT_QTY DEMAND_DATE
11MMS 405 1 5.0000 2018-05-29
11MMS OUTPT_INFUSION 1 4.0000 2018-05-29
11MMS 938 1 15.0000 2018-05-31
11MMS 286 1 1.0000 2018-05-07
11MMS 708 1 4.0000 2018-04-05
这是我到目前为止尝试做的事情:
SELECT MAX(DEMAND_DATE) AS DEMAND_DATE, INV_CART_ID, BUSINESS_UNIT,
INV_ITEM_ID, CART_COUNT_QTY
FROM PS_CART_CT_INF_INV A
WHERE A.INV_ITEM_ID = 1
AND A.BUSINESS_UNIT = '11MMS'
AND A.CART_COUNT_QTY <> 0
AND A.DEMAND_DATE IN (SELECT MAX (DEMAND_DATE) FROM PS_CART_CT_INF_INV B
WHERE A.INV_ITEM_ID = B.INV_ITEM_ID GROUP BY INV_CART_ID)
GROUP BY INV_CART_ID, BUSINESS_UNIT, INV_ITEM_ID, CART_COUNT_QTY
然而它并没有return所有INV_CART_ID #'s并且没有检索到正确的行(错误的DEMAND_DATE):
使用ROW_NUMBER
:
WITH cte AS (
SELECT BUSINESS_UNIT, INV_CART_ID, INV_ITEM_ID, CART_COUNT_QTY, DEMAND_DATE,
ROW_NUMBER() OVER (PARTITION BY INV_CART_ID ORDER BY DEMAND_DATE DESC) rn
FROM PS_CART_CT_INF_INV
WHERE
INV_ITEM_ID = 1 AND
BUSINESS_UNIT = '11MMS' AND
CART_COUNT_QTY <> 0
)
SELECT
BUSINESS_UNIT, INV_CART_ID, INV_ITEM_ID, CART_COUNT_QTY, DEMAND_DATE
FROM cte
WHERE rn = 1
ORDER BY DEMAND_DATE DESC;
如果你不想用解析函数,那我还是不会用你现在的方法。相反,我会像这样加入一个子查询:
SELECT
t1.BUSINESS_UNIT,
t1.INV_CART_ID,
t1.INV_ITEM_ID,
t1.CART_COUNT_QTY,
t1.DEMAND_DATE
FROM PS_CART_CT_INF_INV t1
INNER JOIN
(
SELECT INV_CART_ID, MAX(DEMAND_DATE) AS MAX_DEMAND_DATE
FROM PS_CART_CT_INF_INV
WHERE INV_ITEM_ID = 1 AND BUSINESS_UNIT = '11MMS' AND CART_COUNT_QTY <> 0
GROUP BY INV_CART_ID
) t2
ON t1.INV_CART_ID = t2.INV_CART_ID AND t1.DEMAND_DATE = t2.MAX_DEMAND_DATE
WHERE
t1.INV_ITEM_ID = 1 AND
t1.BUSINESS_UNIT = '11MMS' AND
t1.CART_COUNT_QTY <> 0;
您当前查询的问题(即使已更正)是它在 WHERE
子句中使用了相关子查询。这些已知是潜在的性能杀手,因此应尽可能避免。
我想你想要:
SELECT BUSINESS_UNIT, INV_CART_ID, INV_ITEM_ID, CART_COUNT_QTY, DEMAND_DATE
FROM PS_CART_CT_INF_INV AS a
WHERE INV_ITEM_ID = 1 AND BUSINESS_UNIT = '11MMS' AND
CART_COUNT_QTY <> 0 AND
DEMAND_DATE = (SELECT MAX(b.DEMAND_DATE)
FROM PS_CART_CT_INF_INV as b
WHERE a.INV_CART_ID = b.INV_CART_ID
);
但是,这会给你重复的记录,如果你想避免重复,那么你可以在 WHERE
子句中使用 identity
列或 pk
代替:
. . .
WHERE pk = (SELECT TOP (1) b.pk
FROM PS_CART_CT_INF_INV as b
WHERE a.INV_CART_ID = b.INV_CART_ID
ORDER BY b.DEMAND_DATE DESC
);