2016-10-04 59 views
0

我有一個普通的PostgreSQL查詢,我無法翻譯成漂亮的查詢。當使用groupBy條款時,我會陷入語法湯。將普通PostgreSQL查詢的麻煩轉換爲平滑查詢

SELECT u.id AS investor_id, 
     u.account_type, 
     i.first_name, 
     issuer_user.display_name AS issuer_name, 
     p.legal_name AS product_name, 
     v.investment_date, 
     iaa.as_of AS CCO_approval_date, 
     v.starting_investment_amount, 
     v.maturity_date, 
     v.product_interest_rate, 
     v.product_term_length, 
     i.user_information_id, 
     v.id AS investment_id 
FROM investors u 
JOIN 
    (SELECT ipi.investor_id, 
      ipi.first_name, 
      ipi.user_information_id 
    FROM investor_personal_information ipi 
    JOIN 
    (SELECT investor_id, 
       MAX(id) AS Max_Id 
     FROM investor_personal_information 
     GROUP BY investor_id) M ON ipi.investor_id = m.investor_id 
    AND ipi.id = m.Max_Id) i ON u.id = i.investor_id 
JOIN investments v ON u.id = v.investor_id 
JOIN sub_products AS sp ON v.sub_product_id = sp.id 
JOIN products AS p ON p.id = sp.product_id 
JOIN company AS c ON c.id = p.company_id 
JOIN issuers AS issuer ON issuer.id = c.issuer_id 
JOIN users AS issuer_user ON issuer.owner = issuer_user.id 
JOIN investment_admin_approvals AS iaa ON iaa.investment_id = v.id 
ORDER BY i.first_name DESC; 

我已經開始寫它

val query = { 
    val investorInfoQuery = (for { 
    i <- InvestorPersonalInformation 
    } yield (i)).groupBy { 
    _.investorId 
    }.map { 
    case (id, rest) => { 
     id -> rest.map(_.id).max 
    } 
    } 
} 

我知道我已經創建基礎查詢到一個大的查詢和申請加入分別對他們。任何人都可以幫助指導我或提供一些例子嗎?油滑很難。

+0

一個選項是平滑的SQL。您可以使用現有的sql,並使用光滑的方式將其映射到結果類型。 –

回答

0

看起來很簡單寫。我不打算幫你寫出整個查詢,我只是給你一個例子,你可以按照你的查詢。

比方說,你有以下結構和相應的表查詢定義爲employeesemplayeePackagesemployeeSalaryCredits

case class Employee(id: String, name: String) 

case class EmployeePackage(id: String, employeeId: String, baseSalary: Double) 

case class EmployeeSalaryCredit(id: String, employeeId: String, salaryCredited: Double, date: ZonedDateTime) 

現在,讓我們看看與employee's id, employee's name, base salary, actual credited salary and date of salary credit所有員工全部工資學分那麼你的查詢將看起來像

val queryExample = employees 
    .join(employeePackages) 
    .on({ case (e, ep) => e.id === ep.employeeId }) 
    .join(employeeSalaryCredits) 
    .on({ case ((e, ep), esc) => e.id === esc.employeeId }) 
    .map({ case ((e, ep), esc) => 
    (e.id, e.name, ep.baseSalary, esc.salaryCredited, esc.date) 
    })