Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用Java在PostgreSQL上编程生成OLAP多维数据集_Java_Postgresql_Analytics_Olap Cube - Fatal编程技术网

用Java在PostgreSQL上编程生成OLAP多维数据集

用Java在PostgreSQL上编程生成OLAP多维数据集,java,postgresql,analytics,olap-cube,Java,Postgresql,Analytics,Olap Cube,有没有办法用PostgreSQL和Java实现以下行为: 假设您有两张桌子: 交易和用户事务保存一些事务数据,而用户显然保存用户数据。 这两个表可以在Users.ID==Transactions.UserID条件下联接 由于该联接表中的列很少,所以我想进行一些分析 例如,我想知道每个用户完成了多少事务。很自然,你会这样写: SELECT UserID, COUNT(DISTINCT TransactionID) FROM Users NATURAL JOIN Transactions GROUP

有没有办法用PostgreSQL和Java实现以下行为:

假设您有两张桌子:
交易
用户
<代码>事务保存一些事务数据,而
用户
显然保存用户数据。
这两个表可以在
Users.ID==Transactions.UserID
条件下联接

由于该联接表中的列很少,所以我想进行一些分析

例如,我想知道每个用户完成了多少事务。很自然,你会这样写:

SELECT UserID, COUNT(DISTINCT TransactionID)
FROM Users NATURAL JOIN Transactions
GROUP BY UserID;
不过,我们也可以说,我想获得一些关于每种货币交易的信息

SELECT Currency, COUNT(DISTINCT TransactionID)
FROM Users NATURAL JOIN Transactions
GROUP BY Currency;
或者每个用户使用每种货币支付了多少次:

SELECT UserID, Currency, COUNT(DISTINCT TransactionsID) AS NumTransactions
FROM Users NATURAL JOIN Transactions
GROUP BY UserID, Currency;
但是现在,考虑到最后一条SQL,我可以实现前面两条SQL中的任意一条:

首先,我根据前面的SQL创建一个表:

CREATE TABLE PerUserCurrencyStats AS
SELECT UserID, Currency, COUNT(DISTINCT TransactionsID) AS NumTransactions, SUM(Amount) AS TotalAmount  
FROM Users NATURAL JOIN Transactions
GROUP BY UserID, Currency;
然后,我降低维度,将需要求和的求和:

CREATE TABLE PerUserTransactionCount AS
SELECT UserID, SUM(NumTransactions)
FROM PerUserCurrencyStats
GROUP BY UserID;
好的,那么问题在哪里呢?
嗯,在我看来,这真的很像OLAP多维数据集(请注意,我希望对其他列/维度进行分析)


由于我仅限于使用PostgreSQL并动态生成这样的表,我想知道在我的Java代码中,是否有办法通过调用SQL命令来实现这一点,但不必自己编写所有这些繁琐的代码?

编写所有这些SQL代码可能有点繁琐。正如您提到的Olap多维数据集,我建议您使用mondrian

您可以使用在java代码中嵌入molap引擎

您必须在java代码中使用的模式文件中描述多维数据集、维度和度量

代码片段

package project1;

import java.io.PrintWriter;

import mondrian.olap.Connection;
import mondrian.olap.DriverManager;
import mondrian.olap.Query;
import mondrian.olap.Result;

public class imondrian {

    public static void main(String[] args) {
        String connectString = "Provider=mondrian;" 
            + "Jdbc=jdbc:mysql://localhost:3306/foodmart?user=foodmart&password=foodmart;" 
            + "Catalog=file:/path/to/file/FoodMart.xml;"
            + "JdbcDrivers=com.mysql.jdbc.Driver";

        System.out.println(connectString);

        Connection connection = null;

        connection = DriverManager.getConnection(connectString, null, false);
        Query query = connection.parseQuery(
            "SELECT {[Measures].[Unit Sales], [Measures].[Store Cost], [Measures].[Store Sales]} on columns," 
                + "{([Promotion Media].[All Media], [Product].[All Products])} ON rows "
                + "FROM Sales "
                + "WHERE ([Time].[1997])"
        ); 

        Result result = connection.execute(query);

        result.print(new PrintWriter(System.out,true)); 
    }
}

编写所有这些sql代码可能有点乏味。正如您提到的Olap多维数据集,我建议您使用mondrian

您可以使用在java代码中嵌入molap引擎

您必须在java代码中使用的模式文件中描述多维数据集、维度和度量

代码片段

package project1;

import java.io.PrintWriter;

import mondrian.olap.Connection;
import mondrian.olap.DriverManager;
import mondrian.olap.Query;
import mondrian.olap.Result;

public class imondrian {

    public static void main(String[] args) {
        String connectString = "Provider=mondrian;" 
            + "Jdbc=jdbc:mysql://localhost:3306/foodmart?user=foodmart&password=foodmart;" 
            + "Catalog=file:/path/to/file/FoodMart.xml;"
            + "JdbcDrivers=com.mysql.jdbc.Driver";

        System.out.println(connectString);

        Connection connection = null;

        connection = DriverManager.getConnection(connectString, null, false);
        Query query = connection.parseQuery(
            "SELECT {[Measures].[Unit Sales], [Measures].[Store Cost], [Measures].[Store Sales]} on columns," 
                + "{([Promotion Media].[All Media], [Product].[All Products])} ON rows "
                + "FROM Sales "
                + "WHERE ([Time].[1997])"
        ); 

        Result result = connection.execute(query);

        result.print(new PrintWriter(System.out,true)); 
    }
}

编写所有这些sql代码可能有点乏味。正如您提到的Olap多维数据集,我建议您使用mondrian

您可以使用在java代码中嵌入molap引擎

您必须在java代码中使用的模式文件中描述多维数据集、维度和度量

代码片段

package project1;

import java.io.PrintWriter;

import mondrian.olap.Connection;
import mondrian.olap.DriverManager;
import mondrian.olap.Query;
import mondrian.olap.Result;

public class imondrian {

    public static void main(String[] args) {
        String connectString = "Provider=mondrian;" 
            + "Jdbc=jdbc:mysql://localhost:3306/foodmart?user=foodmart&password=foodmart;" 
            + "Catalog=file:/path/to/file/FoodMart.xml;"
            + "JdbcDrivers=com.mysql.jdbc.Driver";

        System.out.println(connectString);

        Connection connection = null;

        connection = DriverManager.getConnection(connectString, null, false);
        Query query = connection.parseQuery(
            "SELECT {[Measures].[Unit Sales], [Measures].[Store Cost], [Measures].[Store Sales]} on columns," 
                + "{([Promotion Media].[All Media], [Product].[All Products])} ON rows "
                + "FROM Sales "
                + "WHERE ([Time].[1997])"
        ); 

        Result result = connection.execute(query);

        result.print(new PrintWriter(System.out,true)); 
    }
}

编写所有这些sql代码可能有点乏味。正如您提到的Olap多维数据集,我建议您使用mondrian

您可以使用在java代码中嵌入molap引擎

您必须在java代码中使用的模式文件中描述多维数据集、维度和度量

代码片段

package project1;

import java.io.PrintWriter;

import mondrian.olap.Connection;
import mondrian.olap.DriverManager;
import mondrian.olap.Query;
import mondrian.olap.Result;

public class imondrian {

    public static void main(String[] args) {
        String connectString = "Provider=mondrian;" 
            + "Jdbc=jdbc:mysql://localhost:3306/foodmart?user=foodmart&password=foodmart;" 
            + "Catalog=file:/path/to/file/FoodMart.xml;"
            + "JdbcDrivers=com.mysql.jdbc.Driver";

        System.out.println(connectString);

        Connection connection = null;

        connection = DriverManager.getConnection(connectString, null, false);
        Query query = connection.parseQuery(
            "SELECT {[Measures].[Unit Sales], [Measures].[Store Cost], [Measures].[Store Sales]} on columns," 
                + "{([Promotion Media].[All Media], [Product].[All Products])} ON rows "
                + "FROM Sales "
                + "WHERE ([Time].[1997])"
        ); 

        Result result = connection.execute(query);

        result.print(new PrintWriter(System.out,true)); 
    }
}

谢谢你,布鲁诺。我会试试看它是否适合我的需要。同时,这是一个向上的投票:谢谢你,布鲁诺。我会试试看它是否适合我的需要。同时,这是一个向上的投票:谢谢你,布鲁诺。我会试试看它是否适合我的需要。同时,这是一个向上的投票:谢谢你,布鲁诺。我会试试看它是否适合我的需要。同时,这是一个向上的投票:D