标签: greatest-n-per-group

添加“上次发生时间”标志列

我需要在包含 3 列的表中添加一列:

  1. GroupKey - 显示项目的编号。
  2. 状态 - 组根据插入日期所处的状态编号。状态编号可以前后更改多次。
  3. 插入日期 - 状态更改的时间和日期。

这 3 列永远不会改变。它就像一个“日志”表,只能添加行,不能删除或更改行

我需要的第四列(计算列)是一个标志列,它将显示状态是否是基于 insert_date 的最后一次状态更改。

如果是最后一个状态,则显示 1,否则显示 0。我希望我解释得足够好。下面是一个例子:

这是桌子。

sql-server greatest-n-per-group

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

如何将最后一次和第一次出现的项目放入单独的列中?

我确实有一张休闲表:

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 排序的最后一次和第一次出现的值,像这样?

mysql query greatest-n-per-group

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

高效获取最后一条记录

我有一个包含 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)

我担心的是,当我有一个特定仓库的一百万(或更多)订单时,通过排序和选择第一条记录,它会太慢(我认为?)。从我目前得到的建议来看,这不是一项昂贵的操作,因此应该没问题。那正确吗?

或者,有没有更有效的方法来选择最后一个订单记录?

sql-server sql-server-2012 greatest-n-per-group

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

按日期和用户获取表中的最新记录

我有一张如下表:

SELECT [EffectiveDate]
      ,[Rate]
      [ModUser]
      FROM [Vision]
Run Code Online (Sandbox Code Playgroud)

有很多行带有 ModUsers 名称。我需要提供 ModUsers 名称并获取最新费率。

我怎么做?

sql-server greatest-n-per-group

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

PostgreSQL - 不同月份的最大总和与多年的关系

这个问题是关于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)

postgresql cte greatest-n-per-group

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

MySQL 查询失败:SELECT 列表的表达式 #6 不在 GROUP BY 子句中并且包含非聚合列修复错误每次重新启动都会重新出现

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)

但问题是每次我重新启动系统时这个错误都会重新出现。如何解决这个问题?

mysql php greatest-n-per-group

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

如何获得每组第二高的值?

从表中获取第二高值已经解决了很多次,但我正在寻找每组中的第二高值。

鉴于此表:

+----+-----+
| 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)

postgresql select greatest-n-per-group max postgresql-9.6

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

使用 ANY/ALL 检索下订单数量最多的客户

我有这张表,我想检索下订单数量最多的客户。

我写了这个查询:

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' 子句中使用 '>=' 是不是很奇怪?

谢谢你。

sql-server subquery greatest-n-per-group

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