标签: group-by

如果其他列具有相同值,则对唯一列进行约束

我想知道是否可以让一个列对于 MySQL 中另一列的每个值都是唯一的。我想要拥有与 a 相同的功能GROUP BY

这是表格:

CREATE TABLE Example (
    id INT,
    name VARCHAR(100) NOT NULL
);
Run Code Online (Sandbox Code Playgroud)

数据将与此类似:

INSERT INTO Example (id, name) VALUES(1, 'Peter Parker');
Run Code Online (Sandbox Code Playgroud)

以下内容将起作用:

INSERT INTO Example (id, name) VALUES(1, 'Bruce Wayne');
INSERT INTO Example (id, name) VALUES(2, 'Peter Parker');
Run Code Online (Sandbox Code Playgroud)

以下内容不起作用(因为该 id 具有相同的名称):

INSERT INTO Example (id, name) VALUES(1, 'Peter Parker');
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助澄清我想要的事情:

  • 可以有多行具有相同的 ID
  • 可以有多行具有相同的名称
  • 不能有多行具有相同的 ID名称

mysql group-by unique-constraint

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

Group By With Rollup 结果表在顶部有总计

我有以下查询,从星期一开始,按周返回一组计数,一行是汇总总数。

select distinct 
    DATEPART(ISO_WEEK, ig.IN_EVT_DT_TM) as B2B_Week,
    count (distinct bm.MISSION_ID) as B2B_Mission,
    count (distinct dl.DRIVER) as Distinct_B2B_Drivers
from 
    DD.B2B_MISSIONS bm
    inner join dd.IN_GATE ig on bm.MISSION_ID = ig.IN_MISSION_ID
    inner join dd.XNS_DRIVER_LOGIN dl on ig.IN_DRIVER_ID = dl.driver 
group by 
    DATEPART(ISO_WEEK, ig.IN_EVT_DT_TM) 
  with rollup
order by 
    DATEPART(ISO_WEEK, ig.IN_EVT_DT_TM)
;
Run Code Online (Sandbox Code Playgroud)

我的结果表如下所示:

B2B_Week    B2B_Mission Distinct_B2B_Drivers
            1647        357
44          717         264
45          930         301
Run Code Online (Sandbox Code Playgroud)

我希望它看起来像这样:

B2B_Week    B2B_Mission Distinct_B2B_Drivers
44          717         264
45          930         301
TOTAL       1647        357
Run Code Online (Sandbox Code Playgroud)

问题

  1. 总计行出现在顶部而不是底部。这很可能与第二个问题有关。

  2. 我一直无法使用 CASE 语句返回日期列为 NULL 的“TOTAL”。主要问题是 DATE …

sql-server case group-by

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

按其他列选择最近的行

我想根据几个因素选择 MS SQL Server 2008 R2 数据库中的最新行。我看到很多人想在网上做同样的事情,并且提出了很多不同的解决方案,但大多数似乎过于复杂,我无法让任何东西正常工作或做我想做的事。

我有一个表中的数据,其中特定事物(房间)将具有名称,以及具有相应日期/时间(LogTimeStanp)的最新状态(AnalogValue;它与在线状态相关)。

我最感兴趣的是每个房间的当前在线状态,所以我只需要每个房间的最新行。

  • 可以有多个房间,例如 1 - 5,000(没有强加的上限)。
  • 当我查看历史在线状态时,有很多数据会回溯。
  • 此表中还有其他我对此查询不感兴趣的数据。
  • 我必须加入表格以获得可读的房间名称,否则我只有一个 GUID。
  • 我不知道如果我需要使用MAX()SELECT DISTINCTGroup by,或别的东西。我一直无法让这些工作令我满意。

此代码不起作用,但应该让您了解我想要做什么:

SELECT r.RoomName, a.AttributeID, a.AnalogValue, max(a.LogTimeStamp)
  FROM CRV_AttributeLog a join CRV_Rooms r on a.RoomID=r.RoomID
  where a.AttributeID like 'online_status'
Run Code Online (Sandbox Code Playgroud)

我的目的是获得每个房间的最大(最近)LogTimeStamp 的模拟值。

我得到了一个与 group by 一起运行的查询,但它似乎没有对其进行分组(当然也不是按房间名称),所以我想我做错了。

更新 1、2、3、4

添加了图片作为上下文。此外,此查询将构成报告的基础,因此它必须完全具有参考性,这就是为什么我只想要“最新”的在线状态。更复杂的是,“最新的”可能不会在今天、本周或本月发生。但它就在那里,在某个地方,某个时间。

CRV_AttributeLog 中的每一行都有自己的 AttributeID 和 AnalogValue,并且该行通过时间戳 (LogTimeStamp) 成为唯一的。否则, AttributeID 和 AnalogValue 完全有可能跨行匹配(没关系)。此表记录有关何时更改一些不同内容的信息:在线状态、是否出现错误等。 ONLINE_STATUS可以从 0-2(离线、部分在线、在线)更改,并且会在它们之间定期更改。其他 AttributeID 的模拟值也可能会根据其他条件来回更改。

在此处输入图片说明

在此处输入图片说明

期望输出

Room Name          AttributeID     AnalogValue     LogTimeStamp
Conference Room    ONLINE_STATUS   0               2016-06-11 …
Run Code Online (Sandbox Code Playgroud)

sql-server sql-server-2008-r2 group-by distinct

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

使用 GROUP BY 的情况

我有一个看起来像这样的表格(实际案例的过度简化案例来表明我的观点)

CREATE TABLE sales (
   id int,
   currency VARCHAR(5),
   price int
   shop_id int
);
Run Code Online (Sandbox Code Playgroud)

现在我需要进行一个查询,该查询将为我提供类似此表的内容,按商店分组,但给出每种货币的销售额总和我的问题是,当我将货币列设置为非聚合时,它会失败,因为我的查询变得非标准。当我将货币添加到分组依据时,每种货币都会创建新行,这是我不想要的。我已经没有选择了,希望得到任何帮助或指向正确方向的指示。

我使用 MySQL,但如果我能得到适用于更多数据库的解决方案,我将不胜感激(PostGreSQL 位于 MySQL 之后的列表顶部)

查询会产生不需要的结果

SELECT   shop_id, 
         (CASE WHEN currency= "GBP" THEN SUM(price) ELSE 0 END) AS POUND, 
         (CASE WHEN currency= "USD" THEN SUM(price) ELSE 0 END) AS USDOLLAR
GROUP BY shop_id, currency
Run Code Online (Sandbox Code Playgroud)

查询应生成的数据

shop_id     |   POUND   |   USDOLLAR    
-----------------------------------------
    1       |   400     |   300
-----------------------------------------
    2       |   250     |   100
-----------------------------------------
    3       |   400     |   100
-----------------------------------------
Run Code Online (Sandbox Code Playgroud)

mysql postgresql group-by

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

在子查询中使用 MIN() 的替代方法?

我有下foo表:

+----+--------+-------+
| id |  name  |  qty  |
+----+--------+-------+
| 1  |  John  |   3   |
| 2  |  John  |   1   |
| 3  |  Mary  |   5   |
| 4  |  Mary  |   2   |
| 5  |  Gary  |   3   |
| 6  |  Gary  |   4   |
| 7  |  Gary  |   5   |
+----+--------+-------+
Run Code Online (Sandbox Code Playgroud)

我只想选择idname最小Qty分组 by name,结果如下:

+----+--------+
| id |  name  |
+----+--------+
| …
Run Code Online (Sandbox Code Playgroud)

mysql group-by greatest-n-per-group

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

为什么 GROUP BY 子句缺少行

无法理解GROUP BY子句的奇怪行为:

SELECT id, SUM(num) as sum
FROM (
    SELECT 1 AS id, 2 AS num UNION
    SELECT 1, 3) AS a
GROUP BY id
Run Code Online (Sandbox Code Playgroud)

结果是:

SELECT id, SUM(num) as sum
FROM (
    SELECT 1 AS id, 2 AS num UNION
    SELECT 1, 3) AS a
GROUP BY id
Run Code Online (Sandbox Code Playgroud)

SELECT id, SUM(num) as sum
FROM (
    SELECT 1 AS id, 2 AS num UNION
    SELECT 1, 2 /*!*/) AS a
GROUP BY id
Run Code Online (Sandbox Code Playgroud)

结果是:

id  | sum …
Run Code Online (Sandbox Code Playgroud)

sql-server group-by

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

如何在 JSON_AGG 中使用 ORDER BY 和 LIMIT

我有一个返回所需输出的查询。

SELECT 
    shop,
    JSON_AGG(item_history.* ORDER BY created_date DESC) as data
FROM item_history
GROUP BY
    shop;
Run Code Online (Sandbox Code Playgroud)

结果:

[
  {
    "shop": "shop1",
    "data": [
      {
        "id": 226,
        "price": "0",
        "shop": "shop1.com",
        "country": "UK",
        "item": "item1",
        "created_date": "2021-06-07T08:48:42.338201",
      },
      {
        "id": 224,
        "price": "0",
        "shop": "shop1.com",
        "country": "UK",
        "item": "item 1",
        "created_date": "2021-06-07T07:53:25.030621",
      },
      ...
  },
  {
    "shop": "shop2",
    "data": [
      {
        "id": 225,
        "price": "0",
        "shop": "shop2.com",
        "country": "DE",
        "item": "Item 2",
        "created_date": "2021-06-07T08:48:36.443849",
      },
      ...
]
Run Code Online (Sandbox Code Playgroud)

这正是我想要的输出,但问题是它获取data数组下的所有项目,最好限制该数组。我尝试添加LIMIT

SELECT …
Run Code Online (Sandbox Code Playgroud)

postgresql order-by sorting limits group-by

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

如何在 SQL Server 中使用 SUM 和 GROUP BY 连接两个表

我有2张桌子

  1. 产品
ID 指定
1 古柯
2 百事可乐
3 芬达
4
5

2)子产品

产品编号 姓名 数量
1 SM 10
1 lg 10
1 XL 20
2 1升 10
2 2升 20
2 5升 20
3 10
3 20
4 20
4 克德 30

我想要的是这样的:产品表中的指定和总数量,代表具有相同product_id的数量的总和

指定 总数(量
古柯 40
百事可乐 50
芬达 30
50

注:我使用 SQL 服务器

join sql-server query group-by sum

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

不明白 COUNT 和 GROUP BY 的概念?

这不是我的工作,也不是我的家庭作业。我刚刚从 Donatus 教授的 udemy 课程中自学,这些是他在课程中使用的问题。

目标 1: 您的物流经理想要了解每个运输区域在公司数据库中出现的次数。使用 SQL 查询来获取详细信息。

目标 2: 使用 Shipregion 列,计算每个值在该列中出现的次数。

数据库:北风

表:订单

在此输入图像描述

解决方案1:

SELECT ShipRegion,
    COUNT(ShipRegion)
FROM
    orders
GROUP BY ShipRegion;
Run Code Online (Sandbox Code Playgroud)

解决方案2:

SELECT ShipRegion,
    COUNT(*)
FROM
    orders
GROUP BY ShipRegion;
Run Code Online (Sandbox Code Playgroud)

我理解第一个解决方案,但不理解第二个解决方案。

我的困惑: COUNT(*) 如何确保只计算所有船舶区域?是因为使用了group by shipregion吗?

如果是这种情况,在上面的解决方案中,我们还使用g COUNT(shipregion)。我不明白。请帮忙。

mysql count group-by

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

为什么向我的查询添加 LIMIT 会使其爬行?

简单查询:

select sum(score) total,name,gender,dob,country 
from users join scores on users.id = scores.user_id
where date between '2012-01-01' and '2012-01-31 23:59:59'
group by scores.user_id having sum(score)>=1000 order by sum(score) desc limit 50
Run Code Online (Sandbox Code Playgroud)

因此,尝试获取 2012 年 1 月的累积分数列表,按分数降序排列它们并对其进行分页。

无限制:缓慢但可以:搜索 69348 行。(很高兴弄清楚如何避免临时表,但我不能)。解释说:

1, 'SIMPLE', 'scores', 'range', 'user,date,user+date', 'date', '8', '', 69348, 'Using where; Using temporary; Using filesort'
1, 'SIMPLE', 'users', 'eq_ref', 'PRIMARY', 'PRIMARY', '8', 'scores.user_id', 1, 'Using where'
Run Code Online (Sandbox Code Playgroud)

有限制:它是一样的,但行搜索现在是 1806794,它需要永远。

如果有任何区别,它是一个分区的 InnoDB,所有数据都在一个分区上。

mysql optimization limits group-by

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