最长日期无效,替代方法? [英] Max date won't work, alternative?

查看:78
本文介绍了最长日期无效,替代方法?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我通读了一些答案,但找不到以下问题的正确答案.我有以下查询运行:

I read through some of the answers but couldn't find the right answer for the following question. I have the below query that runs:

SELECT 
    mbr_src_code as 'C',
    cst_recno as 'ID',
    ind_first_name as 'FN',
    ind_last_name as 'LN',
    cst_org_name_dn as 'Company',
    cst_ixo_title_dn as 'Title',
    MAX(inv_trx_date) as 'Latest Transaction',
    inv_add_user as 'User',
    pyd_type as 'Type',
    bat_code as 'Code',
    mbr_add_user 'Add User',
    mbr_rejoin_date as 'rejoin',
    mbt_code,
    adr_state as 'state',
    adr_country as 'country',
    ivd_amount_cp
FROM 
    mb_membership  
JOIN 
    co_customer ON cst_key = mbr_cst_key AND mbr_delete_flag = 0  
LEFT JOIN 
    mb_member_type ON mbr_mbt_key = mbt_key 
LEFT JOIN 
    co_customer_x_address ON cxa_key = cst_cxa_key 
LEFT JOIN 
    co_address ON cxa_adr_key = adr_key 
LEFT JOIN 
    co_individual ON ind_cst_key = cst_key 
LEFT JOIN 
    mb_membership_x_ac_invoice ON mxi_mbr_key = mbr_key 
LEFT JOIN  
    ac_invoice ON mxi_inv_key = inv_key 
LEFT JOIN 
    ac_invoice_detail ON ivd_inv_key = inv_key 
LEFT JOIN 
    ac_payment_detail ON pyd_ivd_key = ivd_key 
LEFT JOIN 
    ac_payment ON pyd_pay_key = pay_key 
LEFT JOIN 
    ac_batch ON pay_bat_key = bat_key 
LEFT JOIN 
    ac_payment_info ON pay_pin_key = pin_key
LEFT JOIN 
    co_customer_x_customer ON cxc_cst_key_1 = co_customer.cst_key 
                           AND (cxc_end_date IS NULL OR DATEDIFF(dd, GETDATE(), cxc_end_date) >= 0) 
                           AND cxc_rlt_code = 'Chapter Member' 
LEFT JOIN 
    co_chapter ON cxc_cst_key_2 = chp_cst_key  
WHERE 
    (mbr_src_code LIKE N'%1DMFY18%' OR mbr_src_code LIKE N'%2DMFY18%' 
     OR mbr_src_code LIKE N'%INPhoneFY18%' OR mbr_src_code LIKE N'%OBTMFY18%' 
     OR mbr_src_code LIKE N'%3DMFY18%') 
    AND cst_recno = '20239'
GROUP BY  
    mbr_key, mbr_src_code, cst_recno, 
    ind_first_name, ind_last_name, cst_org_name_dn, cst_ixo_title_dn,
    inv_add_user, pyd_type, bat_code, mbr_add_user, mbr_rejoin_date,
    mbt_code, adr_state, adr_country, pin_cc_number_display, pin_cc_cardholder_name,
    ivd_amount_cp, chp_name
ORDER BY
    ind_last_name

我得到以下结果(样本):

and I get the following result(sample):

      C       ID    FN    LN       Company          Title       Latest transaction     User              Type          Code                    Add User    rejoin   mbt_code           state  country    ivd_amount_cp     
    2DMFY18 20239   Gus Bauman  Beveridge & Diamond Attorney    2013-09-23 00:00:00 Membership Renewal  Payment 2013-09-23-ULI-USD-C-SP-01  ULI_Conversion  NULL    Associate Member    DC  UNITED STATES   430.00  
    2DMFY18 20239   Gus Bauman  Beveridge & Diamond Attorney    2014-08-04 00:00:00 Membership Renewal  Payment 2014-08-04-ULI-USD-C-SP-01  ULI_Conversion  NULL    Associate Member    DC  UNITED STATES   430.00  
    2DMFY18 20239   Gus Bauman  Beveridge & Diamond Attorney    2015-09-02 00:00:00 Membership Renewal  Payment 2015-09-02-ULI-USD-C-SP-02  ULI_Conversion  NULL    Associate Member    DC  UNITED STATES   440.00  
    2DMFY18 20239   Gus Bauman  Beveridge & Diamond Attorney    2016-09-12 00:00:00 Membership Renewal  Payment 2016-09-12-ULI-USD-C-SP-01  ULI_Conversion  NULL    Associate Member    DC  UNITED STATES   440.00  
    2DMFY18 20239   Gus Bauman  Beveridge & Diamond Attorney    2017-09-22 00:00:00 Membership Renewal  Payment 2017-09-22-ULI-USD-C-SP-01  ULI_Conversion  NULL    Associate Member    DC  UNITED STATES   440.00

所以我的MAX函数不起作用(可能是因为还有其他具有不同值的列,就像inv_trx_date中一样),什么是最好的替代方法?我想基本上采用整个查询,然后将每个唯一的cst_recno的MAX(inv_trx_date)选择为最新交易"作为"ID".

So my MAX function doesn't work(probably because there are other columns with different value,just like in inv_trx_date) , what would be the best alternative to use? I would like to basically take the whole query and select MAX(inv_trx_date) as 'Latest Transaction' per each unique cst_recno as 'ID'.

推荐答案

我认为该问题的规范答案如下

I think the canonical answer to this question is as follows

with AllData as
(
select ... from ...
where ...
)
select * from allData ad1
inner join 
(
    select pk1, pk2, pk<n>, max(MaxThing) MaxVal 
    from AllData
    group by pk1, pk2, pk<n>
) as ad2 
on (ad1.pk1=ad2.pk1 and ad1.pk2=ad2.pk2 and ad1.pk<n>=ad2.pk<n> 
and  ad1.MaxThing=ad2.MaxVal)

在您的情况下,cst_recno是PK,inv_trx_date是MaxThing

In your case cst_recno is the PK and inv_trx_date is the MaxThing

这篇关于最长日期无效,替代方法?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆