时间:2015-06-04 18:22:30

标签: sql sql-server sql-server-2000 greatest-n-per-group

我有一张包含大量客户ID的表格。在客户表中也是这些ID,但每个ID可以在同一客户的多个记录中。我想通过order by <my_field> desc

选择我可以获得的最近使用的记录

假设我在此表中有100个客户ID,而在customers表中有120条带有这些ID的记录(有些是重复的)。如何应用我的order by条件才能获取最新的匹配记录?

dbms是sql server 2000.

表基本上是这样的: loc_nbr和cust_nbr是主键

客户在位置1处购物。他们被分配了loc_nbr = 1和cust_nbr = 1 然后是customer_id为1。

他们再次购物,但这次是在位置2.所以他们被分配了loc_nbr = 2和cust_Nbr = 1.然后根据他们的其他属性(如姓名和地址)将同一个customer_id设为1。

因为他们在位置1之后的位置2购物,它将有一个更新的rec_alt_ts值,这是我想要检索的记录。

4 个答案:

答案 0 :(得分:0)

使用查询中的聚合函数按客户ID分组:

  SELECT cust_Nbr, MAX(rec_alt_ts) AS most_recent_transaction, other_fields
    FROM tableName
GROUP BY cust_Nbr, other_fields
ORDER BY cust_Nbr DESC;

这假设rec_alt_ts每次都会增加,因此cust_Nbr的最大条目将是最近的条目。

答案 1 :(得分:0)

由于您没有提供真正的表和字段名称,因此这只是解决方案的伪代码。

select * 
from customer_table t2
inner join location_table t1 
  on t1.some_key = t2.some_key
where t1.LocationKey = (select top 1 (LocationKey) as LatestLocationKey from  location_table  where cust_id = t1.cust_id order by some_field)

答案 2 :(得分:0)

您希望将ROW_NUMBER()函数与公用表表达式(CTE)一起使用。

这是一个基本的例子。您应该能够对数据使用类似的查询。

;WITH TheLatest AS
(
    SELECT *, ROW_NUMBER() OVER (PARTITION BY group-by-fields ORDER BY sorting-fields) AS ItemCount 
    FROM TheTable 
)
SELECT * 
FROM TheLatest 
WHERE ItemCount = 1

更新:我刚注意到这是用sql-server-2000标记的。这仅适用于SQL Server 2005及更高版本。

答案 3 :(得分:-3)

通过使用时间和日期,我们可以为客户提取最新的详细信息。 使用您从中取出客户的日期和时间的列。

例如:

SQL&GT;选择ename,to_date(hiredate,'dd-mm-yyyy hh24:mi:ss')来自emp命令to_date(hiredate,'dd-mm-yyyy hh24:mi:ss');