2016-09-22 27 views
0

我有一个表一堆列,但我只需要5列从表中返回它们是:SQL返回不同的结果,并且不必是不同的列

Name | Charge Code | Charge Amount | Modifier | Date 

我期待根据唯一名称,费用代码,费用金额和修饰符返回字段。日期可以是记录存在的最新日期。我怎样才能做到这一点?

目前我有:

Select 
    Name, Charge_code, Charge_amount, Modifier, Date 
From 
    Table1 
group by 
    Name, Charge_code, Charge_amount, Modifier 

但是当我这样做,它告诉我,因为它不是在无论是聚合函数或一组包含的日期是在选择列表中无效。我不希望通过函数引入组中的日期,那么它将返回一堆不必要的无关行。但我确实希望日期显示该人收取该金额的最新日期。

我也曾尝试

Select 
    Date, Distinct Name, Charge_Code, Charge_amount, Modifier 
From 
    Table 1 

任何想法将是有益的,我新。

感谢

回答

1

你可以试试这个为好,简单易

Select name, 
    charge_code, 
    charge_amount, 
    modifier, 
    max(date) date 
From table1 
Group by name, charge_code, charge_amount, modifier 
+0

这对于这种特殊情况非常有效(事实上应该是最优的),但我仍然鼓励使用row_number() - 它对于此查询应该同样高效,并且无限灵活。例如。如果您想从具有“max(date)”值的同一行/记录*中获得其他随机列值*,可以使用row_number()轻松完成,但不能使用简单的group by。只是说... – SlimsGhost

+0

我同意这一点是更简单的了解我的初学者知道是怎么回事。另一个似乎也很好,但这个我至少可以说明它做得更好。谢谢 –

1

典型的方法是使用row_number()

select Name, ChargeCode, ChargeAmount, Modifier, Date 
from (select t.*, 
      row_number() over (partition by Name, ChargeCode, ChargeAmount, Modifier 
           order by date desc 
           ) as seqnum 
     from t 
    ) t 
where seqnum = 1; 
+0

这看起来是一个很大的不同比我期待的设置。这是一张非常大的桌子,它有多高效?我之前从未在我的查询中使用过seqnum或row_number。请仔细阅读更新的帖子,看看是否仍在使用@TaylorD –

+0

。 。 。表现应该比“一组一组”更好。 –

+1

@TaylorD row_number()和其他分析函数的语法需要一些习惯,但我向你保证,对于查询优化器来说,它比其他任何等效(至少大部分时间)效率更高效。如果你习惯了它,假设你也有一个很好的索引策略,比较执行计划以证明选项等,分析函数将大大提高你的代码的质量。 – SlimsGhost

1
SELECT distinct main.Name, main.ChargeCode, main.ChargeAmount, main.Modifier, 
       b.Date 
FROM Table1 as main 
Outer Apply (Select Top 1 Date 
      from Table1 as sub 
      where main.Name = sub.Name and main.ChargeCode = sub.ChargeCode and main.ChargeAmount = sub.ChargeAmount and main.Modifier = sub.Modifier 
      Order by sub.Date desc 
      ) b