Mysql Join with previous record
You can use two nearly identical subqueries in your original SELECT:

SELECT 
  kk_data_id,
  kk_date,
  kk_egg,
  kk_cash,
  kk_in,
  kk_out,
  kk_expenditure,
  (  SELECT kk_egg              -- You get kk_egg from the "previous" row
       FROM kknagar_data k2 
      WHERE k2.kk_data_id &lt; k1.kk_data_id 
   ORDER BY kk_data_id DESC
      LIMIT 1
  ) AS prev_kk_egg,
  (  SELECT kk_cash              -- You get kk_cash from the "previous" row
       FROM kknagar_data k2 
      WHERE k2.kk_data_id &lt; k1.kk_data_id 
   ORDER BY kk_data_id DESC 
      LIMIT 1
  ) AS prev_kk_cash
FROM 
  kknagar_data k1
  INNER JOIN kknagar_rates kr on kr.kk_rate_id = k1.kk_rate_id ;


Having two subqueries looking for two different columns on the same row looks like a waste of time, but it basically mimics what you're doing right now and it works.

You can check it at SQLFiddle.

Note on aliases

You have one table (kknagar_data) that is accessed for three different purposes. First you use it to get the list of "normal records". That's when this table is used as kknagar_data k1 (which can also be written as kknagar_data AS k1). The k1 is just an alias for the table, within that specific context. 

Then, in your subqueries, you also refer to the same table, but for a different purpose. In that case, I've used a different alias (FROM kknagar_data **k2**), so that I can refer to the same table with two different contexts. The condition k2.kk_data_id &lt; k1.kk_data_id means: look at the same table (k2 and k1 are actually the same table), but right now (k2) choose the ids that are less than the ones for the "normal records" (k1).

Both subqueries use k2 as an alias because I just copied and pasted the code, and changed the column name. That's possible because the symbol k2 is local to each subquery, and cannot be used outside of its context. That's the same as using the same variable name in two adjacent blocks of a program written in, let's say, Java. It is not advisable to use the same alias when one block contains the other, because you would have, at least, ambiguities.

Aliases are needed when you refer more than once to the same table. For instance, when you have self-referencing tables (i.e.: a table persons where you have a parent-child relationship), or when you want to access "a record of the same table somehow related to the one you already have", such as in your case. Sometimes it is just used for simplicity (k1 is shorter than kknagar_data).

Window functions as a (better) alternative

Databases allowing for WINDOW functions would let you to use the lag() function to have the same effect, in a more efficient manner. Check Introduction to LEAD and LAG for Microsoft SQL Server. You can achieve the same with PostgreSQL, or also with the latest versions of MariaDB. MySQL 8.0 is going to have window functions as well.