2014-04-04 64 views
0

请参阅下面的DDL:分区由多个聚合列

CREATE TABLE Test (SupplierID int, CustomerID int, SupplierDate datetime, TestColumn1 varchar(10), TestColumn2 varchar(10)) 
INSERT INTO Test values (1,1, '2010-01-01', 'Apple', 'Banana') 
INSERT INTO Test values (1,2, '2006-01-01', 'Pear', 'Grape') 
INSERT INTO Test values (2,1, '2004-01-01', 'Carrot', 'Pea') 
INSERT INTO Test values (2,2, '2004-01-01', 'Monday', 'Friday') 

请参阅下面的SQL:

select SupplierID, CustomerID, Max(SupplierDate) over (partition by SupplierID), TestColumn1, TestColumn2 from test 

结果如预期是:

1 1 2010-01-01 00:00:00.000 Apple Banana 
1 2 2010-01-01 00:00:00.000 Pear Grape 
2 1 2004-01-01 00:00:00.000 Carrot Pea 
2 2 2004-01-01 00:00:00.000 Monday Friday 

我想结果:

1 1 2010-01-01 00:00:00.000 Apple Banana 
2 1 2010-01-01 00:00:00.000 Apple Banana 
2 2 2006-01-01 00:00:00.000 Carrot Pea 
1 2 2006-01-01 00:00:00.000 Carrot Pea 

即Testcolumn1和TestColumn2需要包含在聚合中。有没有简单的方法来做到这一点与分区?我以前从未使用过分区。

查询应该获取最大供应商日期,然后返回表中供应商ID每行的最大供应商日期加上测试列1和测试列2。

查询需要返回表中的每一行。

+0

所以你W¯¯蚂蚁重复每个组合的SupplierID和CustomerID的第一行两次? –

+1

@ shree.pat18,我已经修正了这个问题,试图让它更清晰。你能再看一次吗? – w0051977

+0

我已经完成了,请检查ans。 – AK47

回答

1

没有完成加入

;WITH x as 
(
    SELECT SupplierID, CustomerID, SupplierDate, 
    CASE WHEN row_number() over (partition by SupplierID order by SupplierDate, 
      customerid desc) = count(*) over (partition by SupplierID) 
    then '' end z, 
    TestColumn1, TestColumn2 
    FROM test 
) 
SELECT SupplierID, CustomerID, 
MAX(SupplierDate) over (partition by SupplierID) SupplierDate, 
MAX(TestColumn1 + z) over (partition by SupplierID) TestColumn1, 
MAX(TestColumn2 + z) over (partition by SupplierID) TestColumn2 
FROM x 

结果:

SupplierID CustomerID  SupplierDate TestColumn1  TestColumn2 
1   2    2010-01-01  Apple   Banana 
1   1    2010-01-01  Apple   Banana 
2   2    2004-01-01  Carrot   Pea 
2   1    2004-01-01  Carrot   Pea 
1

试试这个,

;With CTE as 
(
select SupplierID 
    , CustomerID 
    , Max(SupplierDate) over (partition by CustomerID) as SupplierDate 
    , TestColumn1 
    , TestColumn2 
from test 
) 
Select a.SupplierID,a.CustomerID,a.SupplierDate,b.TestColumn1,b.TestColumn2 from CTE as a 
inner join Test as b on a.SupplierDate = b.SupplierDate 
    and a.CustomerID = b.CustomerID 

方法二,

select a.SupplierID,a.CustomerID,a.SupplierDate,b.TestColumn1,b.TestColumn2 from Test as a 
outer apply 
    (
     select top 1 * from Test 
     where Test.CustomerID = a.CustomerID 
     order by SupplierDate desc 
    )as b 
order by a. CustomerID 
+0

查询需要返回表中的每一行。不管怎么说,还是要谢谢你。 – w0051977

+0

那么现在发生了什么?我有4排。 – AK47

+0

啊,我明白你做了什么。我会现在试试..... – w0051977