我需要在包含 3 列的表中添加一列:
这 3 列永远不会改变。它就像一个“日志”表,只能添加行,不能删除或更改行
我需要的第四列(计算列)是一个标志列,它将显示状态是否是基于 insert_date 的最后一次状态更改。
如果是最后一个状态,则显示 1,否则显示 0。我希望我解释得足够好。下面是一个例子:
我确实有一张休闲表:
id name value
1 Daniel 3
2 Daniel 7
3 Daniel 2
4 Carol 9
5 Carol 4
6 Carol 9
7 Ray 5
8 Charles 1
Run Code Online (Sandbox Code Playgroud)
我想在如下表中获取第一个和最后一个值(按 排序id):
name value_1st value_last
Daniel 3 2
Carol 9 9
Ray 5 NULL
Charles 1 NULL
Run Code Online (Sandbox Code Playgroud)
如何编写查询以获取按名称分组并按 id 排序的最后一次和第一次出现的值,像这样?
我有一个包含 OrderId 的表订单(WarehouseId 和 OrderId 是复合主键)。
WarehouseId | OrderId | ItemId | OrderDate
-------------------------------------------
1 | 1 | 1 | 2016-08-01
1 | 2 | 2 | 2016-08-02
1 | 3 | 5 | 2016-08-10
2 | 1 | 1 | 2016-08-05
3 | 1 | 6 | 2016-08-06
Run Code Online (Sandbox Code Playgroud)
(表格已简化,仅显示必填字段)
如何有效地选择特定仓库的最后一个订单?我目前这样做:
SELECT TOP 1 * FROM tblOrder WHERE WarehouseId = 1 ORDER BY OrderId DESC
Run Code Online (Sandbox Code Playgroud)
我担心的是,当我有一个特定仓库的一百万(或更多)订单时,通过排序和选择第一条记录,它会太慢(我认为?)。从我目前得到的建议来看,这不是一项昂贵的操作,因此应该没问题。那正确吗?
或者,有没有更有效的方法来选择最后一个订单记录?
我有一张如下表:
SELECT [EffectiveDate]
,[Rate]
[ModUser]
FROM [Vision]
Run Code Online (Sandbox Code Playgroud)
有很多行带有 ModUsers 名称。我需要提供 ModUsers 名称并获取最新费率。
我怎么做?
这个问题是关于MySQL 5.6这里的一个问题的PostgreSQL 版本。最初,这是两个 RDBMS 的一个问题,但有人建议我,鉴于两个系统的不同功能,我应该拆分问题 - 特别是我认为 CTE(WITH 子句)应该使查询更加优雅和可读!
假设我有一个肿瘤列表(这个数据是根据真实数据模拟的):
CREATE table illness (nature_of_illness VARCHAR(25), created_at DATETIME);
INSERT INTO illness VALUES ('Cervix', '2018-01-03 15:45:40');
INSERT INTO illness VALUES ('Cervix', '2018-01-03 15:45:40');
INSERT INTO illness VALUES ('Cervix', '2018-01-03 15:45:40');
INSERT INTO illness VALUES ('Cervix', '2018-01-03 15:45:40');
INSERT INTO illness VALUES ('Cervix', '2018-01-03 15:45:40');
INSERT INTO illness VALUES ('Lung', '2018-01-03 17:50:32');
INSERT INTO illness VALUES ('Lung', '2018-02-03 17:50:32');
INSERT INTO illness VALUES ('Lung', '2018-02-03 17:50:32');
INSERT INTO illness VALUES ('Lung', …Run Code Online (Sandbox Code Playgroud) MySQL Query Failed: Expression #6 of SELECT list is not in GROUP BY clause and contains nonaggregated column
Run Code Online (Sandbox Code Playgroud)
使用以下查询修复了此错误。通过以 root 用户身份登录 MySQL 控制台
SET GLOBAL sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));
Run Code Online (Sandbox Code Playgroud)
但问题是每次我重新启动系统时这个错误都会重新出现。如何解决这个问题?
从表中获取第二高值已经解决了很多次,但我正在寻找每组中的第二高值。
鉴于此表:
+----+-----+
| A | 10 |
| A | 20 |
| A | 35 | <-- This record
| A | 42 |
| B | 12 |
| B | 21 | <-- This record
| B | 33 |
| C | 14 |
| C | 23 |
| C | 38 |
| C | 41 | <-- This record
| C | 55 |
+----+-----+
Run Code Online (Sandbox Code Playgroud)
我想获得标记的行。
伪代码:
select col_a, penultimate(col_b) …Run Code Online (Sandbox Code Playgroud) 我有这张表,我想检索下订单数量最多的客户。
我写了这个查询:
select * from customers where cust_id=(
select cust_id from orders
group by cust_id
having count(*)>=all(select count(cust_id)
from orders
group by cust_id))Run Code Online (Sandbox Code Playgroud)
我知道也许有更好的方法来做到这一点,但我惊讶地发现 'ALL' 可以与 '> =' 一起使用
根据我的理解,'ALL' 检查当前行是大于还是小于子查询中的所有行,但我从没想过可以将它与 '=' 一起使用。
如果我将它与 '=' 或 '>' 一起使用,查询不会像我期望的那样返回任何行。
但是如果我将它们一起使用 '>=' 查询会给我正确的结果。
是不是很奇怪?
无论如何,最后我写了这个查询:
SELECT *
FROM Orders, customers
WHERE orders.cust_id=customers.cust_id
and orders.cust_id IN
(SELECT TOP (1) o.cust_id
FROM Orders AS O
GROUP BY O.cust_id
ORDER BY COUNT(*) DESC);Run Code Online (Sandbox Code Playgroud)
你有更好或更优雅的解决方案吗?
在 'ALL' 子句中使用 '>=' 是不是很奇怪?
谢谢你。