select 多条记录基于 order by
select multiple records based on order by
我有一个 table 和一堆客户 ID。在客户 table 中也是这些 ID,但每个 ID 可以在同一客户的多个记录中。我想 select 最近使用的记录,我可以通过 order by <my_field> desc
获得
假设我在这个 table 中有 100 个客户 ID,而在客户 table 中有 120 个包含这些 ID 的记录(有些是重复的)。我如何应用我的 order by
条件来仅获取最新的匹配记录?
dbms 是 sql 服务器 2000。
table 基本上是这样的:
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 值,这是我想要检索的记录。
在查询中使用聚合函数按客户 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
的最大条目将是最近的条目。
由于您没有给出真实的 table 和字段名称,这只是一个解决方案的伪代码。
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)
通过使用时间和日期,我们可以为客户取出最近的详细信息。
使用您从中为客户取出日期和时间的列。
例如:
SQL> select ename , to_date(hiredate,'dd-mm-yyyy hh24:mi:ss') from emp order by to_date(hiredate,'dd-mm-yyyy hh24:mi:ss') ;
您想将 ROW_NUMBER() 函数与通用 Table 表达式 (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 及更高版本。
我有一个 table 和一堆客户 ID。在客户 table 中也是这些 ID,但每个 ID 可以在同一客户的多个记录中。我想 select 最近使用的记录,我可以通过 order by <my_field> desc
假设我在这个 table 中有 100 个客户 ID,而在客户 table 中有 120 个包含这些 ID 的记录(有些是重复的)。我如何应用我的 order by
条件来仅获取最新的匹配记录?
dbms 是 sql 服务器 2000。
table 基本上是这样的: 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 值,这是我想要检索的记录。
在查询中使用聚合函数按客户 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
的最大条目将是最近的条目。
由于您没有给出真实的 table 和字段名称,这只是一个解决方案的伪代码。
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)
通过使用时间和日期,我们可以为客户取出最近的详细信息。 使用您从中为客户取出日期和时间的列。
例如:
SQL> select ename , to_date(hiredate,'dd-mm-yyyy hh24:mi:ss') from emp order by to_date(hiredate,'dd-mm-yyyy hh24:mi:ss') ;
您想将 ROW_NUMBER() 函数与通用 Table 表达式 (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 及更高版本。