相关疑难解决方法(0)

ActiveRecord中的随机记录

我需要通过ActiveRecord从表中获取随机记录.我从2006年开始跟随Jamis Buck的例子.

但是,我也通过Google搜索遇到了另一种方式(由于新的用户限制,无法使用链接进行归因):

 rand_id = rand(Model.count)
 rand_record = Model.first(:conditions => ["id >= ?", rand_id])
Run Code Online (Sandbox Code Playgroud)

我很好奇这里的其他人是如何做到的,或者是否有人知道哪种方式会更有效率.

random ruby-on-rails rails-activerecord

147
推荐指数
11
解决办法
8万
查看次数

快速发现PostgreSQL中表的行数

我需要知道表中的行数来计算百分比.如果总计数大于某个预定义常量,我将使用常量值.否则,我将使用实际的行数.

我可以用SELECT count(*) FROM table.但是如果我的常量值是500,000并且我的表中有5,000,000,000行,那么计算所有行会浪费很多时间.

一旦超过常数值,是否可以停止计数?

只要它低于给定的限制,我只需要确切的行数.否则,如果计数高于限制,我会使用限制值,并希望尽快得到答案.

像这样的东西:

SELECT text,count(*), percentual_calculus()  
FROM token  
GROUP BY text  
ORDER BY count DESC;
Run Code Online (Sandbox Code Playgroud)

sql postgresql row count

89
推荐指数
3
解决办法
7万
查看次数

Postgres中的快速随机行选择

我在postgres中有一个包含数百万行的表.我在网上查了一下,发现了以下内容

SELECT myid FROM mytable ORDER BY RANDOM() LIMIT 1;
Run Code Online (Sandbox Code Playgroud)

它工作,但它真的很慢......是否有另一种方式来进行查询,或者直接选择随机行而不读取所有表格?顺便说一下'myid'是一个整数,但它可以是一个空字段.

谢谢

postgresql random-access

84
推荐指数
6
解决办法
6万
查看次数

表名作为PostgreSQL函数参数

我想在Postgres函数中传递一个表名作为参数.我试过这段代码:

CREATE OR REPLACE FUNCTION some_f(param character varying) RETURNS integer 
AS $$
    BEGIN
    IF EXISTS (select * from quote_ident($1) where quote_ident($1).id=1) THEN
     return 1;
    END IF;
    return 0;
    END;
$$ LANGUAGE plpgsql;

select some_f('table_name');
Run Code Online (Sandbox Code Playgroud)

我得到了这个:

ERROR:  syntax error at or near "."
LINE 4: ...elect * from quote_ident($1) where quote_ident($1).id=1)...
                                                             ^

********** Error **********

ERROR: syntax error at or near "."
Run Code Online (Sandbox Code Playgroud)

以下是更改为此时出现的错误select * from quote_ident($1) tab where tab.id=1:

ERROR:  column tab.id does not exist
LINE 1: ...T EXISTS …
Run Code Online (Sandbox Code Playgroud)

postgresql function dynamic-sql plpgsql identifier

69
推荐指数
4
解决办法
7万
查看次数

Postgres FOR LOOP

我试图从表中获取25个15,000个ID的随机样本.而不是每次都手动按下运行,我正在尝试循环.我完全理解的不是Postgres的最佳用法,但它是我的工具.这是我到目前为止:

for i in 1..25 LOOP
   insert into playtime.meta_random_sample
   select i, ID
   from   tbl
   order  by random() limit 15000
end loop
Run Code Online (Sandbox Code Playgroud)

random postgresql stored-procedures for-loop plpgsql

46
推荐指数
3
解决办法
14万
查看次数

重构PL/pgSQL函数以返回各种SELECT查询的输出

我写了一个函数,输出一个SELECT以文本形式组成的PostgreSQL 查询.现在我不想再输出文本,但实际上SELECT对数据库运行生成的语句并返回结果 - 就像查询本身一样.

到目前为止我所拥有的:

CREATE OR REPLACE FUNCTION data_of(integer)
  RETURNS text AS
$BODY$
DECLARE
   sensors varchar(100);   -- holds list of column names
   type    varchar(100);   -- holds name of table
   result  text;           -- holds SQL query
       -- declare more variables

BEGIN
      -- do some crazy stuff

      result := 'SELECT\r\nDatahora,' || sensors ||
      '\r\n\r\nFROM\r\n' || type ||
      '\r\n\r\nWHERE\r\id=' || $1 ||'\r\n\r\nORDER BY Datahora;';

      RETURN result;
END;
$BODY$
LANGUAGE 'plpgsql' VOLATILE;
ALTER FUNCTION data_of(integer) OWNER TO postgres;
Run Code Online (Sandbox Code Playgroud)

sensors …

sql database postgresql dynamic-sql plpgsql

32
推荐指数
1
解决办法
2万
查看次数

在触发器函数中使用动态表名INSERT

我不确定如何实现以下内容:

CREATE OR REPLACE FUNCTION fnJobQueueBEFORE() RETURNS trigger AS $$
    DECLARE
        shadowname varchar := TG_TABLE_NAME || 'shadow';
    BEGIN
        INSERT INTO shadowname VALUES(OLD.*);
        RETURN OLD;
    END;
$$
LANGUAGE plpgsql;
Run Code Online (Sandbox Code Playgroud)

即将值插入到具有动态生成名称的表中.
执行上面的代码会产生:

ERROR:  relation "shadowname" does not exist
LINE 1: INSERT INTO shadowname VALUES(OLD.*)
Run Code Online (Sandbox Code Playgroud)

它似乎表明变量不会作为表名扩展/允许.我在Postgres手册中没有发现这个.

我已经尝试过EXECUTE这样的事情:

  EXECUTE 'INSERT INTO ' || quote_ident(shadowname) || ' VALUES ' || OLD.*;
Run Code Online (Sandbox Code Playgroud)

但没有运气:

ERROR:  syntax error at or near ","
LINE 1: INSERT INTO personenshadow VALUES (1,sven,,,)
Run Code Online (Sandbox Code Playgroud)

RECORD类型似乎失去了:OLD.*似乎被转换为字符串,并得到的重新解析,导致各种各样的类型的问题(例如NULL值). …

postgresql triggers dynamic-sql plpgsql

31
推荐指数
1
解决办法
2万
查看次数

弃用警告:危险查询方法:ActiveRecord中的随机记录> = 5.2

到目前为止,从数据库获取随机记录的"常见"方法是:

# Postgress
Model.order("RANDOM()").first 

# MySQL
Model.order("RAND()").first
Run Code Online (Sandbox Code Playgroud)

但是,在Rails 5.2中执行此操作时,它会显示以下Deprecation警告:

DEPRECATION WARNING:使用非属性参数调用的危险查询方法(其参数用作原始SQL的方法):"RANDOM()".Rails 6.0中不允许使用非属性参数.不应使用用户提供的值调用此方法,例如请求参数或模型属性.可以通过将它们包装在Arel.sql()中来传递已知安全值.

我对Arel并不熟悉,所以我不确定解决这个问题的正确方法是什么.

ruby-on-rails rails-activerecord deprecation-warning ruby-on-rails-5.2

23
推荐指数
2
解决办法
3373
查看次数

PostgreSQL选择20个随机记录

如何在SQL(PostgreSQL)查询中选择20个随机行?

sql postgresql

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

随机排序的行可重复分页

我有API从DB返回圆顶分页行.它工作正常,但是当我按行排序时,RANDOM()我会在连续的页面上重复.是否有任何选项可以为每个查询设置随机种子?

如果不是可以全局设置随机SEED以强制RANDOM()为每个查询生成相同的值?然后我可以每隔3分钟改变全局随机或类似的东西......


你用这个代码:

SELECT * FROM "table" ORDER BY RANDOM() OFFSET 5 LIMIT 5
Run Code Online (Sandbox Code Playgroud)

现在我想传递种子到这个查询,所以我可以分页随机结果.我应该这样做?:

SELECT "table".*, SETSEED(0.1) FROM "table" ORDER BY RANDOM() OFFSET 5 LIMIT 5
SELECT "table".*, SETSEED(0.1) FROM "table" ORDER BY RANDOM() OFFSET 10 LIMIT 5
Run Code Online (Sandbox Code Playgroud)

结果将正确分页?

random postgresql pagination random-seed

12
推荐指数
3
解决办法
2057
查看次数