Ran*_*Joe 7 sql postgresql view sql-view window-functions
我正在尝试创建一个包含行号的视图,如下所示:
create or replace view daily_transactions as
select
generate_series(1, count(t)) as id,
t.ic,
t.bio_id,
t.wp,
date_trunc('day', t.transaction_time)::date transaction_date,
min(t.transaction_time)::time time_in,
w.start_time wp_start,
w.start_time - min(t.transaction_time)::time in_diff,
max(t.transaction_time)::time time_out,
w.end_time wp_end,
max(t.transaction_time)::time - w.end_time out_diff,
count(t) total_transactions,
calc_att_status(date_trunc('day', t.transaction_time)::date,
min(t.transaction_time)::time,
max(t.transaction_time)::time,
w.start_time, w.end_time ) status
from transactions t
left join wp w on (t.wp = w.wp_name)
group by ic, bio_id, t.wp, date_trunc('day', transaction_time),
w.start_time, w.end_time;
Run Code Online (Sandbox Code Playgroud)
我最终得到了重复的行.SELECT DISTINCT
也不起作用.有任何想法吗?
交易表:
create table transactions(
id serial primary key,
ic text references users(ic),
wp text references wp(wp_name),
serial_no integer,
bio_id integer,
node integer,
finger integer,
transaction_time timestamp,
transaction_type text,
transaction_status text
);
Run Code Online (Sandbox Code Playgroud)
WP表:
create table wp(
id serial unique,
wp_name text primary key,
start_time time,
end_time time,
description text,
status text
);
Run Code Online (Sandbox Code Playgroud)
查看输出:
Erw*_*ter 20
CREATE OR REPLACE VIEW daily_transactions as
SELECT row_number() OVER () AS id
, t.ic
, t.bio_id
, t.wp
, t.transaction_time::date AS transaction_date
, min(t.transaction_time)::time AS time_in
, w.start_time AS wp_start
, w.start_time - min(t.transaction_time)::time AS in_diff
, max(t.transaction_time)::time AS time_out
, w.end_time AS wp_end
, max(t.transaction_time)::time - w.end_time AS out_diff
, count(*) AS total_transactions
, calc_att_status(t.transaction_time::date, min(t.transaction_time)::time
, max(t.transaction_time)::time
, w.start_time, w.end_time) AS status
FROM transactions t
LEFT JOIN wp w ON t.wp = w.wp_name
GROUP BY t.ic, t.bio_id, t.wp, t.transaction_time::date
, w.start_time, w.end_time;
Run Code Online (Sandbox Code Playgroud)
generate_series()
在聚合函数之后应用,但产生多行,从而将所有输出行相乘.row_number()
也被施加后的聚集函数,但只生成一个每行单号.你需要PostgreSQL 8.4或更高版本.date_trunc()
是多余的date_trunc('day', t.transaction_time)::date
.
t.transaction_time::date
实现相同,更简洁,更快捷.
用count(*)
而不是count(t)
.这里的结果相同,但速度要快一些.
其他一些细微的变化.