2017-04-04 72 views
2

目前,我正在使用MySQL 5.6.30,我需要您的帮助。创建从最小量到最大量组的排序按多列

下面是其中的名字是temp_work

+----+-----------+----------+----------+--------+---------+-------+---------+ 
| id | client_id | account | category | t_year | t_month | t_day | amount | 
+----+-----------+----------+----------+--------+---------+-------+---------+ 
| 1 | 100  | Saving | deposit | 2016 | 12  | 14 | 100.84 | 
| 2 | 100  | Checking | withdraw | 2016 | 12  | 15 | 300.24 | 
| 3 | 100  | Checking | deposit | 2016 | 12  | 29 | 60.00 | 
| 4 | 101  | Saving | Withdraw | 2016 | 12  | 29 | 245.16 | 
| 5 | 100  | Saving | Withdraw | 2016 | 12  | 30 | 2200.00 | 
| 6 | 100  | Checking | Withdraw | 2016 | 12  | 30 | 2372.16 | 
| 7 | 100  | Saving | deposit | 2016 | 12  | 30 | 4327.00 | 
| 8 | 101  | Checking | Withdraw | 2017 | 1  | 3  | 80.00 | 
| 9 | 101  | Checking | Withdraw | 2017 | 1  | 3  | 1033.45 | 
| 10 | 100  | Saving | Withdraw | 2017 | 1  | 3  | 1339.16 | 
| 11 | 100  | Checking | deposit | 2017 | 1  | 4  | 140.00 | 
| 12 | 100  | Checking | Withdraw | 2017 | 1  | 4  | 216.73 | 
| 13 | 101  | Checking | Withdraw | 2017 | 1  | 4  | 1261.72 | 
+----+-----------+----------+----------+--------+---------+-------+---------+ 

表中的数据,我需要从最低量最大量组的秩的CLIENT_ID,帐户,类别,t_year,t_month。

所以,这是我所期待的或类似的

+-----------+----------+----------+--------+---------+---------+------+ 
| client_id | account | category | t_year | t_month | amount | rank | 
+-----------+----------+----------+--------+---------+---------+------+ 
| 100  | Checking | deposit | 2016 | 12  | 60.00 | 1 | 
| 100  | Checking | deposit | 2017 | 1  | 140.00 | 1 | 
| 100  | Checking | withdraw | 2016 | 12  | 300.24 | 1 | 
| 100  | Checking | withdraw | 2016 | 12  | 2327.16 | 2 | 
| 100  | Checking | Withdraw | 2017 | 1  | 216.73 | 1 | 
| 100  | Saving | deposit | 2016 | 12  | 100.84 | 1 | 
| 100  | Saving | deposit | 2016 | 12  | 4327.00 | 2 | 
| 100  | Saving | Withdraw | 2016 | 12  | 2200.00 | 1 | 
| 100  | Saving | Withdraw | 2017 | 1  | 1339.16 | 1 | 
| 101  | Checking | Withdraw | 2017 | 1  | 80.00 | 1 | 
| 101  | Checking | Withdraw | 2017 | 1  | 1033.45 | 2 | 
| 101  | Checking | Withdraw | 2017 | 1  | 1261.72 | 3 | 
| 101  | Saving | Withdraw | 2016 | 12  | 245.16 | 1 | 
+-----------+----------+----------+--------+---------+---------+------+ 

这是我第一次尝试:

Select 
tw1.client_id, tw1.account, tw1.category, tw1.t_year, tw1.t_month, tw1.amount 
,@rownum = case when @tmonth <> tw1.t_month then 0 else @rownum + 1 end as ranking 
,@tmonth := t_month as cmonth 
From 
(Select @rownum := 0 from dual) as r, 
(Select @tmonth := 0 from dual) as m, 
(Select client_id, account, category, t_year, t_month, amount 
    From  temp_work as tw 
    Order by client_id, account, category, t_year, t_month, amount) as tw1 

第二个尝试:

Select tw1.client_id, tw1.account, tw1.category, tw1.t_year, tw1.t_month, tw1.amount 
    ,@rownum = case when concat(@tyear, '-', @tmonth) <> concat(t_year, '-', t_month) then 0 else @rownum + 1 end as rank 
    ,@tyear := t_year as cyear 
    ,@tmonth := t_month as cmonth   
From 
(Select @rownum := 0) as r, 
(Select @tyear := 0) as y, 
(Select @tmonth := 0) as m, 
(
Select client_id, account, category, t_year, t_month, amount 
From temp_work 
Order by tw.client_id, tw.account, tw.category, t_year, t_month, tw.amount 
) as tw1 

然而,上述查询给我的相同的结果如下。

+-----------+----------+----------+--------+---------+---------+------+ 
| client_id | account | category | t_year | t_month | amount | rank | 
+-----------+----------+----------+--------+---------+---------+------+ 
| 100  | Checking | deposit | 2016 | 12  | 60.00 | 1 | 
| 100  | Checking | deposit | 2017 | 1  | 140.00 | 1 | 
| 100  | Checking | withdraw | 2016 | 12  | 300.24 | 1 | 
| 100  | Checking | withdraw | 2016 | 12  | 2327.16 | 0 | 
| 100  | Checking | Withdraw | 2017 | 1  | 216.73 | 1 | 
| 100  | Saving | deposit | 2016 | 12  | 100.84 | 1 | 
| 100  | Saving | deposit | 2016 | 12  | 4327.00 | 0 | 
| 100  | Saving | Withdraw | 2016 | 12  | 2200.00 | 1 | 
| 100  | Saving | Withdraw | 2017 | 1  | 1339.16 | 1 | 
| 101  | Checking | Withdraw | 2017 | 1  | 80.00 | 1 | 
| 101  | Checking | Withdraw | 2017 | 1  | 1033.45 | 0 | 
| 101  | Checking | Withdraw | 2017 | 1  | 1261.72 | 0 | 
| 101  | Saving | Withdraw | 2016 | 12  | 245.16 | 1 | 
+-----------+----------+----------+--------+---------+---------+------+ 

请给我提示,以解决这个问题。

非常感谢。

+2

这是一个非常困难的模式进行工作。如果你的金额都是+/-,取决于他们的行为,存款是+和撤回是 - 通常更好。有很多方法来组织这个,但[总帐](https://en.wikipedia.org/wiki/General_ledger)是一个很好的开始。对于事务使用本地'DATE'类型也是一个好主意。独立的月/年专栏非常令人讨厌。 – tadman

+0

[MySQL中的等级函数]的可能重复(http://stackoverflow.com/questions/3333665/rank-function-in-mysql) – jordiburgos

回答

0

考虑一个相关的计数聚合子查询的排名:

SELECT t.client_id, t.account, t.category, t.t_year, t.t_month, t.amount, 
     (SELECT COUNT(*) FROM temp_work sub 
     WHERE sub.amount <= t.amount 
     AND sub.client_id = t.client_id 
     AND sub.account = t.account 
     AND sub.t_year = t.t_year 
     AND sub.t_month = t.t_Month) AS rank 
FROM temp_work t 
ORDER BY t.client_id, t.account, t.category, t.t_year, t.t_month, t.amount 
+0

美丽!它完美的工作! –

1

尝试重新排列您的Order by语句以使您的“金额”为订单中的第二个值。这会让你更接近你想要的东西。

Order by client_id, amount, account, category, t_year, t_month

您列出您的列将决定它们的排列顺序的顺序。

欲了解更多信息:https://dev.mysql.com/doc/refman/5.7/en/sorting-rows.html

+0

谢谢你的帮助。我试过了,但它不起作用。结果是一样的 –