Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/62.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
MySQL每天按值排序_Sql_Mysql_Rank - Fatal编程技术网

MySQL每天按值排序

MySQL每天按值排序,sql,mysql,rank,Sql,Mysql,Rank,我正试图通过700个符号,按每天的回报率%进行排名 例如: date symbol pct_return ----------------------------- 1100101 IBM 1.2 1100101 AAPL 2.1 1100101 HPQ -0.5 对于日期1100101,大约还有700个类似的条目 1100102 IBM -.02 1100102 AAPL -.6 1100102 HPQ

我正试图通过700个符号,按每天的回报率%进行排名

例如:

date     symbol    pct_return
-----------------------------
1100101  IBM       1.2
1100101  AAPL      2.1
1100101  HPQ       -0.5
对于日期1100101,大约还有700个类似的条目

1100102  IBM       -.02
1100102  AAPL      -.6
1100102  HPQ       1.9
对于日期1100102,大约还有700个类似的条目

我试图做的是创建一个查询或存储过程来循环每天,然后对每天内每个符号的返回百分比进行排名并插入排名值

我想插入百分比回报的升序和降序排名的排名值

排名后仅3个符号的示例表如下所示:

date     symbol    pct_return    rank_asc   rank_desc
------------------------------------------------------
1100101  IBM       1.2             2         2
1100101  AAPL      2.1             3         1
1100101  HPQ       -0.5            1         3
1100102  IBM       -.02            2         2
1100102  AAPL      -.6             1         3
1100102  HPQ       1.9             3         1

您可以使用此语法在选择中选择行号:

SELECT @row := @row + 1 as row, t.*
FROM table t, (SELECT @row := 0) r;
然后,您可以使用
orderby
按每天的升序和降序选择所有值,并将它们插入表中

资料来源:

例如:

INSERT INTO [your table]
SELECT date, symbol, pct_return, @row := @row + 1
FROM [your other table] t, (SELECT @row := 0) r
ORDER BY pct_return ASC;

要获取升序值,则使用类似的查询对同一个表进行更新以获取降序值。

这是组内聚合的典型问题,通过左自排除联接解决

您不需要任何存储过程来获得所需的结果,只需将一个简单的
插入到。。。选择…
query即可

下面是一个包含所提供数据的示例脚本:

CREATE TABLE shuffled_symbols ( dat INT NOT NULL ,symbol VARCHAR(4) NOT NULL ,pct_return DECIMAL(4,2) NOT NULL ,PRIMARY KEY (dat ,symbol) ); CREATE TABLE ranked_symbols ( dat INT NOT NULL ,symbol VARCHAR(4) NOT NULL ,pct_return DECIMAL(4,2) NOT NULL ,rank_asc INT UNSIGNED NOT NULL ,rank_desc INT UNSIGNED NOT NULL ); INSERT INTO shuffled_symbols (dat,symbol,pct_return) VALUES (1100101,'IBM',1.2); INSERT INTO shuffled_symbols (dat,symbol,pct_return) VALUES (1100101,'AAPL',2.1); INSERT INTO shuffled_symbols (dat,symbol,pct_return) VALUES (1100101,'HPQ',-0.5); INSERT INTO shuffled_symbols (dat,symbol,pct_return) VALUES (1100102,'IBM',-0.02); INSERT INTO shuffled_symbols (dat,symbol,pct_return) VALUES (1100102,'AAPL',-0.6); INSERT INTO shuffled_symbols (dat,symbol,pct_return) VALUES (1100102,'HPQ',1.9); 下面是我如何扩展布伦特的 PERL的示例。这是非常重要的 对我很有帮助,我非常感激 社区支持

要从命令行运行代码,请执行以下操作:

rank.pl从表NORANK到表WITHRANK pct\U return DESC


请为该表提供CREATE TABLE语句。CREATE TABLE
T\u 0\u ranked2
date
int(11)默认为NULL,
sym
varchar(8)默认为NULL,
pct\u return
decimal(8,2)默认为NULL,
event\u id
int(10)未签名非NULL,主键使用BTREE(
event\u id
)ENGINE=MyISAM默认字符集=1;插入
T_0_ranked2
值(1100101,'IBM','1.20',1),(1100101,'AAPL','2.10',2),(1100101,'HPQ','-0.50',3),(1100102,'IBM','-0.02',4),(1100102,'AAPL','-0.60',5),(1100102,'HPQ',1.90',6);谢谢你,布鲁诺!成功了。非常感谢。你的笔记很贴切,符号列表中没有重复,主键的使用也很受欢迎。我发现它更具可扩展性和快速性。对于我来说,PERL是管理循环的最简单的方法,循环需要经历很多天。我将在附加注释中发布代码。此解决方案不起作用(查询,而不是PERL代码),因为它给您一个行号,而不是秩,即,如果您有两个符号具有相同的pct_返回值,它将以随机顺序对它们进行排序,并为每个符号返回不同的秩。您的权利,Bruno。谢谢你指出这一点。当我在您的查询中遇到一些规模问题时,它将挂起,我的数据库中有超过200000个条目。我对PERL代码进行了编程,使其朝着正确的方向发展。我不知道如何优雅地提出一个可扩展的解决方案。思想? SELECT * FROM ranked_symbols; +---------+--------+------------+----------+-----------+ | dat | symbol | pct_return | rank_asc | rank_desc | +---------+--------+------------+----------+-----------+ | 1100101 | AAPL | 2.10 | 3 | 1 | | 1100101 | HPQ | -0.50 | 1 | 3 | | 1100101 | IBM | 1.20 | 2 | 2 | | 1100102 | AAPL | -0.60 | 1 | 3 | | 1100102 | HPQ | 1.90 | 3 | 1 | | 1100102 | IBM | -0.02 | 2 | 2 | +---------+--------+------------+----------+-----------+ 6 rows in set (0.00 sec)
#!/usr/bin/perl -w

use strict;
use warnings;
use Carp;

// connect to database here

// Not enough command-line arguments, helpful error message.
if(@ARGV!=4) {
    die("$0 requires four arguments. 1.FromTable 2.ToTable 3.Order by value(ex.pct_return) 4.ASC (low = 1) or DESC(high = 1)\n");
}

// Use variables for insert to minimize errors
// $OrderBy is the value to rank 
// $AscDesc declares which way to rank
my $FromTable = $ARGV[0];
my $ToTable   = $ARGV[1];
my $OrderBy   = $ARGV[2];
my $AscDesc   = $ARGV[3];


// DateTable is table of dates for use within the insert query. Used to loop through and rank individual days.
my $query7 = "SELECT dat FROM DateTable ORDER BY dat ASC";
my $sth7   = $dbh->prepare($query7) || carp DBI::errstr;
$sth7->execute() || carp DBI::errstr;

// Fetchrow_hashref holds all dates from date tables and while loop walks through one at a time
// The insert sorts by a value and then a row number is added to provide a rank of values
// The nested sth exists because need to reference $dateVar from fetchrow
while(my $ref = $sth7->fetchrow_hashref()) {
    my $dateVar = $ref->{dat};
    print "$dateVar \n";
    my $query6 = "INSERT INTO $ToTable 
        SELECT t.*,". '@rownum := @rownum +1' . " 
        FROM $FromTable t, ".'(SELECT @rownum := 0) r  
        WHERE dat ='."$dateVar
        ORDER BY $OrderBy $AscDesc";
    my $sth6 = $dbh->prepare($query6) || carp DBI::errstr;
    $sth6->execute() || carp DBI::errstr;
    $sth6->finish();
}

$sth7->finish();
$dbh->disconnect();