Sql server =最大值(st2.购买日期) ) 分组 memberkey ,成员姓名 ,项目名称 ,uomname ,itemkey ,uomkey 订购人 项目名称 ,memberkey; 逻辑是在我的真实表格上进行的声音测试。我喜欢cte的使用。似乎比我原来的解决方

Sql server =最大值(st2.购买日期) ) 分组 memberkey ,成员姓名 ,项目名称 ,uomname ,itemkey ,uomkey 订购人 项目名称 ,memberkey; 逻辑是在我的真实表格上进行的声音测试。我喜欢cte的使用。似乎比我原来的解决方,sql-server,tsql,Sql Server,Tsql,=最大值(st2.购买日期) ) 分组 memberkey ,成员姓名 ,项目名称 ,uomname ,itemkey ,uomkey 订购人 项目名称 ,memberkey; 逻辑是在我的真实表格上进行的声音测试。我喜欢cte的使用。似乎比我原来的解决方案工作得更快-谢谢!我将用更大的查询检查io和时间统计数据,但我怀疑您的性能会更好。@user1130761,再次查看了一下,发现它是同一物品和成员的所有记录的购买金额总和。快速更改并更正了逻辑错误。请参阅更新的代码。 Member (memb

=最大值(st2.购买日期) ) 分组 memberkey ,成员姓名 ,项目名称 ,uomname ,itemkey ,uomkey 订购人 项目名称 ,memberkey;
逻辑是在我的真实表格上进行的声音测试。我喜欢cte的使用。似乎比我原来的解决方案工作得更快-谢谢!我将用更大的查询检查io和时间统计数据,但我怀疑您的性能会更好。@user1130761,再次查看了一下,发现它是同一物品和成员的所有记录的购买金额总和。快速更改并更正了逻辑错误。请参阅更新的代码。
Member (membername varchar(50), memberkey int)

Items  (itemname varchar(50), itemkey int)

UOM    (uomname varchar(50), uomkey int)

Fact   (memberkey int, itemkey int, uomkey int, purchaseamount decimal(18,2), quantity int, purchasedate date)
    declare @MemberKeys as varchar(max)
    set @MemberKeys = '702,1382,1389,1390,1391,1392,1393,1394,1395,1396,1397,1401,1402,1404,1405,1406,1516,1844';
    create table #mk (memberName varchar(253), memberkey smallint)

    insert into #mk (memberName, memberkey)
    Select Rownbr + '.)  '  +  membername, memberkey from (
    SELECT
        cast(ROW_NUMBER() OVER(ORDER BY [MemberFacilityName] ASC) as varchar (10)) AS RowNbr
        ,k.value as memberkey
        ,m.memberName

    FROM 
        Member m
        INNER JOIN dbo.String_To_SmallInt_Table(@MemberKeys, ',') AS k
        ON m.Memberkey = k.value            
        ) X
    select m.membername
    ,i.itemname
    ,u.uomname
    ,purchaseamount 
    ,quantity
    ,purchaseamount/quantity as price  
    from Fact f
    join #mk m
    on m.memberkey = f.memberkey
    join Item i
    on i.itemkey = f.itemkey
    join UOM u
    on u.uomkey= f.uomkey
Member   Item   Price
 mbr1       A   1.11
 mbr2       A   1.12
 mbr3       A   1.52
 mbr4       A   2.01
 mbr1       B   3.01
 mbr2       B   3.03
 mbr3       B   3.12
 mbr4       B   3.41
 mbr1       C   6.01
 mbr2       C   6.63
 mbr3       C   6.92
 mbr4       C   6.99
    declare @MemberKeys as varchar(max)

    set @MemberKeys = '702,1382,1389,1390,1391,1392,1393,1394,1395,1396,1397,1401,1402,1404,1405,1406,1516,1844';

    create table #mk (memberName varchar(253), memberkey smallint)


    insert into #mk (memberName, memberkey)
    Select Rownbr + '.)  '  +  membername, memberkey from (
    SELECT
        cast(ROW_NUMBER() OVER(ORDER BY [MemberFacilityName] ASC) as varchar (10)) AS RowNbr
        ,k.value as memberkey
        ,m.memberName

    FROM 
        Member m
        INNER JOIN dbo.String_To_SmallInt_Table(@MemberKeys, ',') AS k
        ON m.Memberkey = k.value            
        ) X

    create table #mostrecentpurchase(purchasedate date, itemkey int, uomkey int, memberkey int)

    Insert into #mostrecentpurchase(purchasedate, itemkey, uomkey, memberkey)
    select max(f.PurchaseDate) purchasedate
    , f.itemKey
    , f.uomkey
    , f.memberkey
    from  Fact f
    join #mk m
    on m.memberkey = f.memberkey
    group by f.itemkey
    , f.uomkey
    , f.memberkey


    select x.* FROM (
    select m.memberName
    , i.itemname
    , i.itemkey
    , f.purchasedate
    , sum(f.purchaseamount) as purchaseamount
    , sum(f.quantity) as quantity
    , u.uomname
    , sum(f.purchaseamount)/sum(f.quantity) as price 
    , count(m.memberName) OVER(PARTITION BY i.vendorItem_PK,u.UnitOfmeasure) AS mbrCount
    from 
    fact f
    join #mk m
    on m.memberkey = f.memberkey
    join #mostrecentpurchase mrp
    on mrp.purchasedate = f.PurchaseDate
    and mrp.memberkey = f.memberkey
    and mrp.uomkey = f.uomkey
    and mrp.vendoritemkey = f.itemkey
    join item i
    on i.itemkey = f.itemkey
    join uom u
    on u.uomkey = f.uomkey
    group by m.membername,i.itemname,i.itemkey,f.purchasedate,u.uomname
    ) X
    where mbrCount >= @MemberCompCount
    order by X.itemname, X.memberName


    drop table #mk;
    drop table #mostrecentpurchase;
/****Create Sample Data*****/

-->Member table
IF exists (SELECT 1 from dbo.sysobjects WHERE name = 'Member')
DROP TABLE Member
GO

CREATE TABLE Member (membername VARCHAR(50), memberkey INT)
GO 
INSERT INTO Member VALUES
('mbr1',702),
('mbr2',1382),
('mbr3',1389),
('mbr4',1390),
('mbr5',1391),
('mbr6',1392),
('mbr7',1393),
('mbr8',1394),
('mbr9',1395),
('mbr10',1396),
('mbr11',1397),
('mbr12',1401),
('mbr13',1402),
('mbr14',1404),
('mbr15',1405),
('mbr16',1406),
('mbr17',1516),
('mbr18',1111)-->Should NOT show up in query
GO

-->Items table
IF exists (SELECT 1 from dbo.sysobjects WHERE name = 'Items')
DROP TABLE Items
GO

CREATE TABLE Items  (itemname VARCHAR(50), itemkey INT)
GO
INSERT INTO Items VALUES
('A',1),
('B',2),
('C',3),
('D',4)

GO

-->UOM table   
IF exists (SELECT 1 from dbo.sysobjects WHERE name = 'UOM')
DROP TABLE UOM
GO
CREATE TABLE UOM    (uomname VARCHAR(50), uomkey INT)
GO

INSERT INTO UOM  VALUES ('QTY', 1)
GO

-->Fact table
IF exists (SELECT 1 from dbo.sysobjects WHERE name = 'Fact')
DROP TABLE Fact
GO
CREATE TABLE Fact   (memberkey INT, itemkey INT, uomkey INT, purchaseamount      decimal(18,2), quantity INT, purchasedate date)
GO

INSERT INTO Fact VALUES 
(702,  1, 1, 1.11, 2, '1/3/2012'),-->Should show up in query
(1382, 1, 1, 1.12, 3, '1/4/2013'),-->Should NOT show up in query
(1382, 1, 1, 1.14, 2, '7/5/2013'),-->Should show up in query
(1404, 1, 1, 1.21, 2, '1/7/2012'),-->Should show up in query
(1401, 2, 1, 3.01, 1, '4/2/2013'),-->Should NOT show up in query
(1111, 3, 1, 6.92, 1, '12/12/2012'),-->Should NOT show up in query
(702,  3, 1, 5.01, 2, '4/1/2011'),-->Should show up in query
(1401, 3, 1, 4.01, 1, '6/5/2012'),-->Should show up in query
(1397, 4, 1, 5.45, 1, '7/4/2013'),-->Should NOT show up in query
(1397, 4, 1, 5.22, 3, '3/15/2011')-->Should NOT show up in query
GO


/*****Code to get results*****/
BEGIN  

-->Members to Filter On
DECLARE @MemberKeys AS VARCHAR(max)
SET @MemberKeys = '702,1382,1389,1390,1391,1392,1393,1394,1395,1396,1397,1401,1402,1404,1405,1406,1516,1844';


-->Parse out comma delimited VALUES into a table variable
DECLARE @Member TABLE 
(
memberkey INT
)
DECLARE @spot SMALLINT, @str VARCHAR(max), @sql VARCHAR(max)  

WHILE @MemberKeys <> ''  
BEGIN  
    SET @spot = CHARINDEX(',', @MemberKeys)  
    IF @spot>0  
        BEGIN  
            SET @str = LEFT(@MemberKeys, @spot-1) 
            SET @MemberKeys = RIGHT(@MemberKeys, LEN(@MemberKeys)-@spot)  
        END  
    ELSE  
        BEGIN  
            SET @str = @MemberKeys 
            SET @MemberKeys = ''  
        END  
    INSERT INTO @Member VALUES(CONVERT(VARCHAR(100),@str))   
END  

END;


-->Display Results
WITH staged(memberkey, membername, itemname ,itemkey, uomname, uomkey, purchaseamount, quantity, price, purchasedate, noitems )  
AS
(
SELECT 
 m.memberkey
,m.membername
,i.itemname
,i.itemkey
,u.uomname
,u.uomkey
,f.purchaseamount 
,f.quantity
,f.purchaseamount/f.quantity as price  
,f.purchasedate
,COUNT(m.memberkey) OVER(PARTITION BY i.itemkey )-COUNT(m.memberkey) OVER(PARTITION BY  convert(VARCHAR,m.memberkey)+convert(VARCHAR,i.itemkey) ) as noitems
FROM 
Fact f
    JOIN Member m ON m.memberkey = f.memberkey
    JOIN Items i ON i.itemkey = f.itemkey
    JOIN UOM u ON u.uomkey= f.uomkey
 WHERE 
 EXISTS(SELECT 1 FROM @Member m2 WHERE m.memberkey=m2.memberkey)
 )
 SELECT
      memberkey, 
      membername, 
      itemname ,
          itemkey,
      uomname, 
          uomkey,
      sum(purchaseamount) as purchaseamount , 
      sum(quantity) as quantity , 
      sum(price) as price, 
      max(purchasedate) as purchasedate
 FROM
      staged st
 WHERE
          noitems>0
          and exists(
    select  memberkey, 
            itemkey ,
            uomkey,
            max(purchasedate) as maxdate 
           from staged st2 
                            where st.memberkey=st2.memberkey 
                            and st.itemkey=st2.itemkey 
                            and st.uomkey=st2.uomkey

            group by  
            memberkey, 
            itemkey ,
            uomkey
            having st.purchasedate=max(st2.purchasedate)
            )
 GROUP BY 
          memberkey 
     ,membername  
     ,itemname  
     ,uomname
         , itemkey 
     , uomkey 
 ORDER BY 
         itemname 
         ,memberkey;