【问题标题】:SQL: Prioritizing MAX CalculationsSQL:优先考虑 MAX 计算
【发布时间】:2021-11-04 12:39:28
【问题描述】:

我正在使用下面的代码为每个项目提取日期/序列中的最新记录,每个项目一行。我发现的问题是我认为我需要优先考虑日期作为 MAX,然后计算最大序列。第二个表显示了我对项目 5356262(和其他一些)遇到的问题,这个 sku 没有将任何数据拉入查询...我相信因为最大 SEQ 与最大 SEQ 位于不同的行日期,所以它变得混乱?

任何帮助将不胜感激。谢谢。

一般数据示例:

item exdt seq M L
35435353 6/2/2021 3 $52 $15
64363663 5/24/2021 1 $33 $5
75474747 7/24/2021 2 $13 $3

问题示例(尝试仅获取 2021 年 7 月 24 日的记录)。

item exdt seq M L
5356262 6/2/2021 3 $52 $15
5356262 5/24/2021 1 $33 $5
5356262 7/24/2021 1 $13 $3
SELECT *
(SELECT item, cpp, exdt, seq, tvt_1 + tft_1 AS ttot_1
     FROM      dbo.sample123) AS p
PIVOT (SUM(ttot_1) FOR cpp IN ([M], [L], [OH]])) AS pvtc
WHERE  (exdt =
      (SELECT MAX(exdt) AS exdtmax
       FROM      dbo.sample123 t2
       WHERE   (LTRIM(t2.item)=LTRIM(pvtc.item))))
AND (seqn =
      (SELECT MAX(seq) AS seqmax
      FROM      dbo.sample123 AS t2
      WHERE LTRIM(t2.item)=LTRIM(pvtc.item)))

【问题讨论】:

标签: sql sql-server tsql max


【解决方案1】:

最简单的方法可能是使用类似ROW_NUMBER 的东西和 ORDER BY 子句来控制确定第一行的方式。像这样的:

SELECT *
FROM (
  SELECT *, ROW_NUMBER() OVER(PARTITION BY item ORDER BY exdt DESC, seq ASC) as rownum
  FROM (
    SELECT item, cpp, exdt, seq, tvt_1 + tft_1 AS ttot_1
    FROM dbo.sample123
  ) AS p
  PIVOT (SUM(ttot_1) FOR cpp IN ([M], [L], [OH])) AS pvtc
) a
WHERE rownum = 1

【讨论】:

    【解决方案2】:

    您是否想简单地获取每组行的最大日期的元组?然后做点别的?

    然后将问题分解为更小的问题并单独解决:

    应该这样做:

    假设你想得到每组属性a的最大值b(可以是几个属性):

    select * 
    from table 
    where (a, b) in (select a, max(b) from table group by a));
    

    如果您需要然后选择具有最大属性 c 的元组,那么您可以将上面的查询包装到子查询中:

    with t as (select * 
       from table 
       where (a, b) in (select a, max(b) from table group by a)))
    
    select * from t where c in (select max(c) from t)
    

    ;

    【讨论】:

      猜你喜欢
      • 2012-11-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-12-04
      • 1970-01-01
      • 2010-10-27
      • 1970-01-01
      • 2022-11-28
      相关资源
      最近更新 更多