小编Lui*_*uiz的帖子

TIMESTAMPTZ 索引和函数不变性

我们有一个类似于以下的结构:

create table company
(
    id bigint not null,
    tz text not null
);

create table company_data
(
    company_id bigint not null,
    ts_tz timestamp with time zone not null
);
Run Code Online (Sandbox Code Playgroud)

表格已简化。

在这里摆弄示例数据:SQL Fiddle

每个公司都有一个固定的 TZ。因此,当我们需要从中提取一些信息时,company_data我们使用类似于以下内容的查询:

select
       cd.company_id,
       cd.ts_tz at time zone c.tz
from company_data cd
join company c on c.id = cd.company_id;
Run Code Online (Sandbox Code Playgroud)

我们还有一个函数来获取公司 tz:

create or replace function tz_company(f_company_id bigint) returns text
    language plpgsql
as
$$
declare
    f_tz text;
begin
    select c.tz from company c where c.id …
Run Code Online (Sandbox Code Playgroud)

postgresql

10
推荐指数
1
解决办法
461
查看次数

结合同一桌子的不同行 - Postgres

我们有一个表格,可以保存有关员工间隔的信息.我们称之为INTERVAL_TABLE.

我们在用户开始间隔和完成时保存.用户可以根据需要多次开始间隔,也可以按照自己的意愿完成多次.

这是一个简化的结构INTERVAL_TABLE:

   INTERVAL_ID | USER_ID | INTERVAL_TYPE_ID | INTERVAL_TIMESTAMP | ENTRY_TYPE
Run Code Online (Sandbox Code Playgroud)

用户可以在表中包含以下条目:

表可能的条目

现在,我们必须创建一个报告,该报告组合了该表的不同条目,这些条目引用相同的用户和间隔类型.我们应该能够识别具有开始和结束的间隔,并将这两个分组在一行中.假设上图中的数据,报告的输出应如下:

报告预期产出

输出应按日期排序,如上图所示.

我不知道如何创建一个查询来做到这一点.

谢谢!

编辑 - 额外信息:

要找到任何INIT间隔的END间隔,我们应该根据该间隔的时间戳找到最接近的END间隔.这就是我们如何知道我们应该将ID 1与ID 2匹配而不是ID 3.

重要的是要注意,如果INIT间隔后跟另一个INIT间隔(基于时间戳),我们不应该继续为该INIT找到END.那是因为这是一个没有END的INIT.

sql postgresql

6
推荐指数
1
解决办法
546
查看次数

Apache ProxyPass错误

我必须将80上的所有apache请求重定向到8080上的tomcat,除了一个路径.

所以,如果收到http://example.com/anything - > tomcat:8080.

但是,如果网址是:http://example.com/site - > apache应该服务,不需要重定向.

目前,有一个名为siteinside 的文件夹/var/www/html/.

这是我当前的配置文件:

site.conf (此文件仅包含以下内容,位于conf.d文件夹中)

<LocationMatch "/*">
        Allow from all
        ProxyPass               /site !  
        ProxyPass               http://127.0.0.1:8080
        ProxyPassReverse        http://127.0.0.1:8080
</LocationMatch>
Run Code Online (Sandbox Code Playgroud)

我认为这是用apache完成的一个简单的事情,但我已经尝试了所有我能找到的东西,但我仍然得到错误:

ProxyPass|ProxyPassMatch can not have a path when defined in a location.
Run Code Online (Sandbox Code Playgroud)

问题是root网站是在tomcat上运行的,而另一个是在apache上运行的(我在这个问题中称之为站点的那个).

如果有人可以帮忙,我很感激.

谢谢!

更新1 - 09/06/2017

如果我删除LocationMatchProxyPass 直接放入.conf文件,我得到它的工作:

ProxyPass               /site !
ProxyPassReverse        /site !
ProxyPass               / http://127.0.0.1:8080
ProxyPassReverse        / http://127.0.0.1:8080
Run Code Online (Sandbox Code Playgroud)

但是,我想知道,为什么呢?将此指令放在LocationMatch标记之外有什么影响?而且,最重要的是,为什么我不能使用相同的结果LocationMatch

apache tomcat proxypass

5
推荐指数
1
解决办法
1375
查看次数

在 PostgreSQL 中正确处理 TIME WITH TIME ZONE

我们有一个表格,里面装满了来自另一个系统的遗留报告的数据。该表的列反映了报告的相同结构。

以下是表的缩写结构:

CREATE TABLE IF NOT EXISTS LEGACY_TABLE (
  REPORT_DATE DATE NOT NULL,
  EVENT_ID BIGINT PRIMARY KEY NOT NULL,
  START_HOUR TIMESTAMP WITHOUT TIME ZONE,
  END_HOUR TIME WITHOUT TIME ZONE,
  EXPECTED_HOUR TIME WITHOUT TIME ZONE
);
Run Code Online (Sandbox Code Playgroud)

我们正在重构这个表来处理不同客户端的不同时区。新结构将类似于:

CREATE TABLE IF NOT EXISTS LEGACY_TABLE (
  REPORT_DATE DATE NOT NULL,
  EVENT_ID BIGINT PRIMARY KEY NOT NULL,
  START_HOUR TIMESTAMP WITH TIME ZONE,
  END_HOUR TIME WITH TIME ZONE,
  EXPECTED_HOUR TIME WITH TIME ZONE
);
Run Code Online (Sandbox Code Playgroud)

这些小时字段表示由 REPORT_DATE 列表示的一天中的特定时间点。我的意思是每个 TIME 列都代表 REPORT_DATE 中指定的一天中的一个时刻。

其他一些需要考虑的点:

  • 我们不知道为什么我们从旧系统收到的报告中的 START_HOUR 是 …

postgresql timezone date-arithmetic dst

5
推荐指数
1
解决办法
1154
查看次数

如何将列添加到查询而不需要将它们放在组中?

我有一个表来保存进程.

每个流程都由项目组成,每个项目都有其在流程中收集的值.

进程由客户端执行.

以下是带有虚拟数据的示例数据库方案:http://sqlfiddle.com/#!15/36af4

我需要从这些表中提取一些信息:

  • 物品ID
  • 物品生活
  • 每件物品的总生产过程
  • 每个项目每个生命中最古老的流程(时间戳)
  • 每个项目每个生命的最新流程(时间戳)
  • 每个项目每个生命的最大项目值
  • 每个项目每个生命的最小项目值

我还需要找到每个生命中项目的最新和最旧过程的进程ID和客户端ID:

  • 每个项目每个生命中最早进程的进程ID
  • 每个项目每个生命的最新流程的流程ID
  • 每个项目每个生命中最早进程的客户端ID
  • 每个项目每个生命的最新流程的客户端ID

请注意,对于特定生命周期中的特定项目,最旧进程的进程ID与该生命中该项目的最小值的进程ID不匹配.

我需要为每件物品的每一个生命提供所有这些信息.一个项目可以在不同的客户端中有一个进程,因此我不能按客户端进行分组,因为这会使该项目可能重复.流程也是如此,因为项目可以存在于不同的流程中,我也不能按流程分组.

这是我能为自己做的最远的事情:

 SELECT
  PV.ID_ITEM                                                       AS ID_ITEM,
  PV.ITEM_LIFE                                                     AS LIFE,
  COUNT(PV.ID_ITEM)                                                AS TOTAL_ITEM_PROCESS,
  MIN(P.DATE_TIME)                                                AS OLDEST_PROCESS,
  MAX(P.DATE_TIME)                                                AS NEWEST_PROCESS,
  MAX(GREATEST(PV.ITEM_VALUE_1, PV.ITEM_VALUE_2, PV.ITEM_VALUE_3)) AS MAX_ITEM_VALUE,
  MIN(LEAST(PV.ITEM_VALUE_1, PV.ITEM_VALUE_2, PV.ITEM_VALUE_3))    AS MIN_ITEM_VALUE
FROM PROCESS P
  JOIN PROCESS_VALUES PV ON P._ID = PV.ID_PROCESS
GROUP BY PV.ID_ITEM, PV.ITEM_LIFE;
Run Code Online (Sandbox Code Playgroud)

但是我不知道如何在这个查询中添加最旧和最新进程的客户端和进程ID,而无需在group by子句中添加这些相同的列.例如,如果我在组中添加客户端ID,则如果在不同客户端中存在进程,则会复制某些项目.

我们不能使用MAX或MIN来获取进程ID,因为返回的ID与收集的时间戳不匹配.并不总是较高的ID具有最新的时间戳.

对于小提琴中提供的数据,这应该是输出:

+---------+-----------+-----------------------------------+----------------------------------+----------------------------------+----------------------------------+----------------------------------+----------------------------------+----------------------------------+---------------------------------+---------------------------------+
| ITEM ID | ITEM LIFE | TOTAL PROCESSES PER ITEM PER …
Run Code Online (Sandbox Code Playgroud)

sql postgresql greatest-n-per-group

5
推荐指数
1
解决办法
214
查看次数

使用RxJava + Retrofit失败时返回自定义异常

我有一个必须返回的存储库类:Observable<List<SomeObject>我这样做:

 @Override
    public Observable<List<SomeObject>> getAllById(Long id) {
        if (!AndroidUtils.isNetworkAvailable(mContext))
            return Observable.error(new NoNetworkConnectionException());

        return mRestService.get(id);
    }
Run Code Online (Sandbox Code Playgroud)

这种方法正常工作,问题是我想在发生故障时返回自定义异常,但我不知道使用rxjava执行此操作的最佳方法.

到目前为止,唯一有效的解决方案是这样的:

@Override
public Observable<List<SomeObject>> getAllById(Long id) {
    if (!AndroidUtils.isNetworkAvailable(mContext))
        return Observable.error(new NoNetworkConnectionException());

    return Observable.create(subscriber -> {
        mRestService.get(id).subscribe(new Observer<List<SomeObject>>() {
            @Override
            public void onCompleted() {
                subscriber.onCompleted();
            }

            @Override
            public void onError(Throwable e) {
                if (e instanceof HttpException  && ((HttpException) e).code() == 401)
                    subscriber.onError(new UnathorizedException());
                else
                    subscriber.onError(e);
            }

            @Override
            public void onNext(List<SomeObject> objects) {
                subscriber.onNext(objects);
            }
        });
    });
}
Run Code Online (Sandbox Code Playgroud)

我知道使用Observable.create不是一件好事,但我无法想出另一种方法.

RestService是这样的:

public interface RestService …
Run Code Online (Sandbox Code Playgroud)

android rx-java retrofit2

3
推荐指数
2
解决办法
3787
查看次数

在Java中使用System.getenv()的性能影响

我有一个使用jersey构建的Java REST Web服务,出于安全原因,我想在OS环境变量中保存方法的参数:DriverManager.getConnection();。网址,用户名和密码。

由于每个请求都需要创建自己的连接,因此我想知道是否有如此多的调用System.getenv("key");是性能问题?

这样做的想法来自本文:http : //docs.aws.amazon.com/elasticbeanstalk/latest/dg/java-rds.html#java-rds-javase

拥有这样的东西将是一个更好的选择:

public class EnvironmentHelper {
    static final String URL;
    static final String USERNAME;
    static final String PASSWORD;

    static {
        URL = System.getenv("URL");
        USERNAME = System.getenv("USERNAME");
        PASSWORD = System.getenv("PASSWORD");
    }
}
Run Code Online (Sandbox Code Playgroud)

这样,我只加载一次变量,对吗?无论我收到多少请求。

java amazon-web-services

1
推荐指数
1
解决办法
927
查看次数