Postgres中的嵌套分区

时间:2018-09-03 21:43:40

标签: sql postgresql window-functions unique-constraint data-partitioning

我正在尝试创建引荐代码基础结构。我想使用用户电子邮件中的前12个字符,并使用整数进行重复数据消除:

因此,给三个用户使用电子邮件bob@gmail.combob@hotmail.combob@yahoo.com,我想生成代码bobbob1和{{ 1}}。

我已经使用以下sql完成了此操作:

bob2

这很好,但是有两种边缘情况:

1)引荐代码必须是全局唯一的,因此将用户UPDATE user_referral_codes urc SET referral_code = ( LEFT(LEFT(email, strpos(email, '@') - 1), 12) || (CASE WHEN seqnum > 1 THEN (seqnum-1)::TEXT ELSE '' END) ) FROM ( SELECT users.*, row_number() OVER ( PARTITION BY LEFT(LEFT(email, strpos(email, '@') - 1), 12) ORDER BY id ) AS seqnum FROM users ) AS u WHERE urc.user_id = u.id; bob1@gmail.com添加到组合中将导致以下配对:

bob2@gmail.com

我该如何解决?

2)还有第二个代码,coupon_codes。我还如何确保此表不重复?

例如如果存在优惠券代码bob@gmail.com | bob bob@hotmail.com | bob3 bob@yahoo.com | bob4 bob1@gmail.com | bob1 bob2@gmail.com | bob2 ,那么bob2也应该获得推荐代码bob2@gmail.com

示例架构:

bob21

示例选择查询显示当前(不完整)行为:

    CREATE TABLE users(
  id                    bigint                      NOT NULL PRIMARY KEY,
  email                 TEXT                        NOT NULL UNIQUE
 );

CREATE TABLE user_referral_codes(
  user_id                 bigint          NOT NULL REFERENCES users (id),
  referral_code           TEXT
);

CREATE TABLE coupon_codes(
  code_id                 TEXT
);

INSERT INTO users(id, email) VALUES(1, 'bob@flockcover.com');
INSERT INTO users(id, email) VALUES(2, 'bob@google.com');
INSERT INTO users(id, email) VALUES(3, 'bob@gmail.com');
INSERT INTO users(id, email) VALUES(4, 'bob1@gmail.com');

INSERT INTO user_referral_codes(user_id) VALUES(1);
INSERT INTO user_referral_codes(user_id) VALUES(2);
INSERT INTO user_referral_codes(user_id) VALUES(3);
INSERT INTO user_referral_codes(user_id) VALUES(4);

INSERT INTO coupon_codes(code_id) VALUES('bob2');

sqlfiddle链接演示问题: http://sqlfiddle.com/#!17/0a6ea

0 个答案:

没有答案