我有一个带有复合主键(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从日期分组的表中检索最后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) 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(或更少)?
我的数据库方案,
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)
数据样本
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', …
我有一个日期时间的时间序列,存储在mySQL中的双列,并且想每分钟对时间序列进行一次采样(即,以一分钟的间隔拉出最后一个值)。在一个select语句中是否有一种有效的方法来做到这一点?
蛮力方式将涉及选择整个序列并在客户端进行采样,或者为每个点发送一个选择(例如select * from data where timestamp<xxxxxxxxx order by timestamp desc limit 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 BY和LIMIT,而不是PostgreSQL.
我认为这两个表之间的连接子句不是唯一(或者甚至是最好的方法),如果它可以只store_id在employees表的内部工作,那么我会对其他方法持开放态度.之后可以随时加入.
由于我对SQL很陌生,我想要任何理论背景或其他解释可以帮助我理解工作原理.
假设我有下表:
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) 我已经看到了这个问题,这几乎正是我想要的。但由于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) 我想在表格中为每组选择 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)
我有一个如下表所示的模型,
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 视图中将这个查询实现为查询集。
我正在尝试从每个类别中获取前 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) 我有这样的表数据:
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) sql ×9
mysql ×6
sql-order-by ×2
django ×1
django-orm ×1
group-by ×1
join ×1
limit ×1
postgresql ×1
select ×1
sql-limit ×1
sqlite ×1
time-series ×1