我有一个活动的cust_id和时间戳列表。我想添加一个名为“activity_order”的列,它会为每个cust_id发出一个订单,其中“1”被分配给最大时间戳
cust_id | time_stamp
________ __________
a1 2015-01-31 10:48:43
a1 2015-01-31 12:48:46
a1 2015-01-31 17:50:40
b1 2015-01-25 10:39:01
b1 2015-01-31 12:53:34
这就是我想要的结果:
cust_id | time_stamp | activity_order
________ ___________________ _________________
a1 2015-01-31 10:48:43 3
a1 2015-01-31 12:48:46 2
a1 2015-01-31 17:50:40 1
b1 2015-01-25 10:39:01 2
b1 2015-01-31 12:53:34 1
这是我的尝试,但问题是这个CASE语句只有这么大,我想我需要一个循环或类似的东西,以防cust_id大于> 2项活动。
SELECT a.cust_id
,a.time_stamp
,CASE WHEN a.time_stamp = b.max_ts THEN 1 ELSE 2 END as activity_order
FROM ACTIVITY a
JOIN (SELECT
cust_id
,MAX(time_stamp) as max_ts
FROM activity_order) b
ON a.cust_id = b.cust_id
答案 0 :(得分:2)
SELECT cust_id
, time_stamp
, RANK () OVER(PARTITION BY cust_id ORDER BY time_stamp DESC) as activity_order
FROM activity
ORDER BY cust_id ASC, activity_order DESC
工作示例:http://sqlfiddle.com/#!6/b6d85/3
了解更多信息:http://docs.oracle.com/cd/B19306_01/server.102/b14200/functions123.htm
答案 1 :(得分:0)
尝试假设MS SQL
Update B
Set Activity_Order = RN
From
(select CustID, [Time_stamp], Row_Number() Over(Partition By CustID Order By [Time_stamp] desc) as RN
From Activity) A
inner join Activity B on A.CustID = B.CustID and A.[Time_stamp] = B.[Timestamp]
答案 2 :(得分:0)
我希望Row_Number带有分区。 注意:您使用3 cust_ID:a1,b1,b2。但是你的例子在b2下命令b1。 这是你的例子中的错误吗?
这是我的尝试:
SELECT
cust_id, time_stamp,
activity_order = ROW_NUMBER() OVER (PARTITION BY cust_id ORDER BY cust_id ASC, time_stamp DESC)
FROM ACTIVITY