【问题标题】:select different Max ID's for different customer为不同的客户选择不同的 Max ID
【发布时间】:2015-12-17 20:58:03
【问题描述】:

情况:

我们每月都有文件加载到我们的数据仓库中,但是这些文件并没有被旧负载替换,而是在彼此之上编译。这些文件是在几天内加载的。

所以在运行 SQL 脚本时,我们会得到重复的记录,因此为了抵消这种情况,我们运行一个超过 10-20 个“客户”的联合并选择 Max(loadID),例如

SELECT
Customer
column 2
column 3

FROM
MyTable

WHERE
LOADID = (SELECT MAX (LOADID) FROM MyTable WHERE Customer= 'ASDA')

UNION 


SELECT
Customer
column 2
column 3

FROM
MyTable

WHERE
LOADID = (SELECT MAX (LOADID) FROM MyTable WHERE Customer= 'TESCO'

上述联合必须为多个客户完成,所以我想肯定有一个更有效的方法。

我们不能在 SELECT 语句中使用 MAX (LoadID),因为可能的情况可能会导致以下情况;

星期一:Asda、Tesco、Waitrose 加载到 DW(LoadID 为 124)

星期二:Sainsburys 在 DW 中加载(LoadID 为 125)

星期三:在 DW 中加载了新的 Tesco(LoadID 为 126)

所以我想要 LoadID 124 Asda & Waitrose、125 Sainsburys 和 126 Tesco

【问题讨论】:

    标签: sql sql-server tsql


    【解决方案1】:

    使用窗口函数:

    SELECT t.*
    FROM (SELECT t.*, MAX(LOADID) OVER (PARTITION BY Customer) as maxLOADID
          FROM MyTable t
         ) t
    WHERE LOADID = maxLOADID;
    

    【讨论】:

    • 这个!!我们有赢家!谢谢戈登。所以我问了 2 个问题,并且都与 PARTITION BY 有关,所以猜猜我会读到什么!
    【解决方案2】:

    派生表的子查询会满足您的需求吗?

    select yourfields
    from yourtables join
    (select customer, max(loadID) maxLoadId
    from yourtables
    group by customer) derivedTable on derivedTable.customer = realTable.customer
        and loadId = maxLoadId
    

    【讨论】:

    • 谢谢 Dan,这可能有效,但 Gordon 的看起来更高效,所以我会建议个人这样做
    猜你喜欢
    • 2022-01-19
    • 2012-06-15
    • 2010-11-02
    • 1970-01-01
    • 1970-01-01
    • 2015-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多