相关疑难解决方法(0)

为表中的每个ID选择最新的3条记录

我有一个带有复合主键(ID,Date)的表,如下所示.

+------+------------+-------+
|  ID  |    Date    | Value |
+------+------------+-------+
|   1  | 1433419200 |   15  |
|   1  | 1433332800 |   23  |
|   1  | 1433246400 |   41  |
|   1  | 1433160000 |   55  |
|   1  | 1432900800 |   24  |
|   2  | 1433419200 |   52  |
|   2  | 1433332800 |   23  |
|   2  | 1433246400 |   39  |
|   2  | 1433160000 |   22  |
|   3  | …

sql sqlite group-by sql-order-by greatest-n-per-group

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

获得每组前n个结果

我使用sql从日期分组的表中检索最后20行.我想限制它,以便在每个post_day组中只选择前10行投票DESC.

SELECT *, DATE(timestamp) as post_day 
FROM stories 
ORDER BY post_day DESC, votes DESC
LIMIT 0, 20
Run Code Online (Sandbox Code Playgroud)

这就是表格的样子:

STORYID         TIMESTAMP           VOTES
1               2015-03-10          1
2               2015-03-10          2
3               2015-03-9           5
4               2015-03-9           3
Run Code Online (Sandbox Code Playgroud)

mysql sql

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

按组MySQL排名前10

SELECT * FROM `scores` natural join users 
GROUP BY user_id,`level_id` 
order by level_id,time_to_win
Run Code Online (Sandbox Code Playgroud)

我如何限制结果,使得每个level_id只会在结果中排​​名前10(或更少)?

mysql sql

5
推荐指数
0
解决办法
56
查看次数

在mysql中选择group by的最小值

我的数据库方案,

CREATE TABLE `result` (
`ID` bigint(21) NOT NULL AUTO_INCREMENT,
`datetime` datetime DEFAULT NULL,
`recordnum` int(11) DEFAULT NULL,
`recordtype` int(11) DEFAULT NULL,
`minvalue` int(11) DEFAULT NULL,
`maxvalue` int(11) DEFAULT NULL,
`data1` int(11) DEFAULT NULL,
`data2` int(11) DEFAULT NULL,
`area` varchar(32) DEFAULT NULL,
PRIMARY KEY (`ID`),
UNIQUE KEY `res` (`datetime`,`recordnum`,`area`)
) ENGINE=MyISAM AUTO_INCREMENT=7 DEFAULT CHARSET=latin1;
Run Code Online (Sandbox Code Playgroud)

数据样本

INSERT INTO `result` VALUES ('1', '2013-03-26 12:03:31', '2', '1', '5', '10', '100', '200','Zone1');

INSERT INTO `result` VALUES ('2', '2013-03-26 12:03:31', '2', '1', '2', '7', '20', …
Run Code Online (Sandbox Code Playgroud)

mysql sql select

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

采样SQL时间序列

我有一个日期时间的时间序列,存储在mySQL中的双列,并且想每分钟对时间序列进行一次采样(即,以一分钟的间隔拉出最后一个值)。在一个select语句中是否有一种有效的方法来做到这一点?

蛮力方式将涉及选择整个序列并在客户端进行采样,或者为每个点发送一个选择(例如select * from data where timestamp<xxxxxxxxx order by timestamp desc limit 1)。

sql time-series

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

限制每组加入的行数(不是1行)

鉴于这些表格:

TABLE Stores (
 store_id INT,
 store_name VARCHAR,
 etc
);

TABLE Employees (
 employee_id INT,
 store_id INT,
 employee_name VARCHAR,
 currently_employed BOOLEAN,
 etc
);
Run Code Online (Sandbox Code Playgroud)

我想为每家商店列出15名雇员最长的员工(假设15 employee_id名员工最低),或者如果有15名员工,则列出所有员工currently_employed='t'.我想用join子句来做.

我发现很多人这样做的例子只有 1行,通常是最小或最大(单个最长雇用的员工),但我想基本上结合一个ORDER BY和一个LIMIT内部的联接.其中一些例子可以在这里找到:

我也找到了很好的例子来做这个商店(我没有,我有大约5000家商店):

我也看到你可以使用TOP而不是ORDER BYLIMIT,而不是PostgreSQL.

我认为这两个表之间的连接子句不是唯一(或者甚至是最好的方法),如果它可以只store_id在employees表的内部工作,那么我会对其他方法持开放态度.之后可以随时加入.

由于我对SQL很陌生,我想要任何理论背景或其他解释可以帮助我理解工作原理.

sql postgresql join greatest-n-per-group sql-limit

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

获取每组最新的n条记录

假设我有下表:

id  coulmn_id  value    date
1      10      'a'     2016-04-01
1      11      'b'     2015-10-02
1      12      'a'     2016-07-03
1      13      'a'     2015-11-11
2      11      'c'     2016-01-10
2      23      'd'     2016-01-11
3      11      'c'     2016-01-09
3      111     'd'     2016-01-11
3      222      'c'     2016-01-10
3      333      'd'     2016-01-11
Run Code Online (Sandbox Code Playgroud)

对于 n = 3,我想为每个 id 获取最新的 n 条记录<=3。所以我将有以下输出:

id  column_id  value    date
1      10        'a'     2016-04-01
1      12        'a'     2016-07-03
1      13        'a'     2015-11-11
2      11        'c'     2016-01-10
2      23        'd'     2016-01-11
3      111       'd' …
Run Code Online (Sandbox Code Playgroud)

mysql sql greatest-n-per-group

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

使用Bigquery(标准SQL)获取每组分组结果的前n条记录

我已经看到了这个问题,这几乎正是我想要的。但由于BQ不允许用户定义变量,因此我无法在标准SQL的Bigquery上使用它。

注意 -我有任意数量的组,因此UNION按照链接问题中的第一个答案将所有组都放入是不可行的。

以下是最简单的示例,尽管任何解决方案都应能够扩展到需要n个顶级结果的地方:

给定下面的表格,其中包含“人员”,“组”和“年龄”列,您将如何获得每个组中年龄最大的2个人?(组内的领带不应产生更多结果,而应以任意顺序给出前2个)

+--------+-------+-----+
| Person | Group | Age |
+--------+-------+-----+
| Bob    | 1     | 32  |
| Jill   | 1     | 34  |
| Shawn  | 1     | 42  |
| Jake   | 2     | 29  |
| Paul   | 2     | 36  |
| Laura  | 2     | 39  |
+--------+-------+-----+
Run Code Online (Sandbox Code Playgroud)

所需的结果集:

+--------+-------+-----+
| Shawn  | 1     | 42  |
| Jill   | 1     | 34  |
| Laura  | …
Run Code Online (Sandbox Code Playgroud)

sql google-bigquery

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

在 Redshift 中按类别选择 n 个最大计数

我想在表格中为每组选择 X 对最常见的对。让我们考虑下表:

+-------------+-----------+
| identifier  |    city   |
+-------------+-----------+
| AB          |  Seattle  |
| AC          |  Seattle  |
| AC          |  Seattle  |
| AB          |  Seattle  |
| AD          |  Seattle  |
| AB          |  Chicago  |
| AB          |  Chicago  |
| AD          |  Chicago  |
| AD          |  Chicago  |
| BC          |  Chicago  |
+-------------+-----------+
Run Code Online (Sandbox Code Playgroud)
  • 西雅图,AB 出现 2 次
  • 西雅图,AC 发生 2 次
  • 西雅图,AD 发生 1 次
  • 芝加哥,AB 发生 2 次
  • 芝加哥,AD 发生 2 …

sql amazon-redshift

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

使用 Django 查询集获取每个组的前 n 条记录

我有一个如下表所示的模型,

create table `mytable`
(
  `person` varchar(10),
  `groupname` int,
  `age` int
);
Run Code Online (Sandbox Code Playgroud)

我想从每组中选出 2 个最年长的人。原始的 SQL 问题和答案在这里StackOverflow,有效的解决方案之一是

SELECT
    person,
    groupname,
    age
FROM
(
    SELECT
        person,
        groupname,
        age,
        @rn := IF(@prev = groupname, @rn + 1, 1) AS rn,
        @prev := groupname
    FROM mytable
    JOIN (SELECT @prev := NULL, @rn := 0) AS vars
    ORDER BY groupname, age DESC, person
) AS T1
WHERE rn <= 2
Run Code Online (Sandbox Code Playgroud)

您也可以在此处检查 SQL 输出以及SQLFIDLE

我只是想知道如何在 Django 视图中将这个查询实现为查询集。

django django-orm

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

MySQL为每个类别选择前N行

我正在尝试从每个类别中获取前 2 行最新行,并且可以稍后对其进行缩放,因此我可能会获得前 4 行而不是前 2 行。

这是我的桌子的样子

  Id   | category_id | created_at
------ | -----------   ----------
   1   |      1      | 2017-12-01
   2   |      2      | 2017-12-02
   3   |      4      | 2017-12-03
   4   |      2      | 2017-12-04
   5   |      1      | 2017-12-05
   6   |      1      | 2017-12-06
   7   |      3      | 2017-12-07
   8   |      4      | 2017-12-08
   9   |      4      | 2017-12-09
   10  |      3      | 2017-12-10
   11  |      5      | 2017-12-11
Run Code Online (Sandbox Code Playgroud)

我想获得最新的 2 行(基于 created_at 列)id,所以我希望输出类似于

      Ids     
    ------ 
       5 …
Run Code Online (Sandbox Code Playgroud)

mysql

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

在有序选择中选择前 3 行

我有这样的表数据:

id,time,otherdata
a,1,fsdfas
a,2,fasdfag
a,3,fasdfas
a,7,asfdsaf
b,8,fasdf
a,8,asdfasd
a,9,afsadfa
b,10,fasdf
...
Run Code Online (Sandbox Code Playgroud)

所以本质上,我可以通过说以下内容按我想要的顺序选择所有数据:

select * from mytable ordered by id,time;
Run Code Online (Sandbox Code Playgroud)

所以我按照我想要的顺序获取所有记录,首先按 id 排序,然后按时间排序。但不是获取所有记录,我需要每个 id 的最新 3 次。

回答:

嗯,我想出了怎么做。我很惊讶它的速度有多快,因为我正在处理几百万行数据,大约需要 11 秒。我在 sql 脚本中编写了一个程序来执行此操作,这就是它的样子。-- 请注意,它不是获取最后 3 行,而是获取最后“n”行数据。

use my_database;

drop procedure if exists getLastN;
drop table if exists lastN;

-- Create a procedure that gets the last three records for each id
delimiter //
create procedure getLastN(n int)
begin
  # Declare cursor for data iterations, and variables for storage
  declare idData varchar(32); …
Run Code Online (Sandbox Code Playgroud)

mysql sql-order-by limit greatest-n-per-group

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