我想知道是否可以让一个列对于 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)
希望这可以帮助澄清我想要的事情:
我有以下查询,从星期一开始,按周返回一组计数,一行是汇总总数。
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)
问题
总计行出现在顶部而不是底部。这很可能与第二个问题有关。
我一直无法使用 CASE 语句返回日期列为 NULL 的“TOTAL”。主要问题是 DATE …
我想根据几个因素选择 MS SQL Server 2008 R2 数据库中的最新行。我看到很多人想在网上做同样的事情,并且提出了很多不同的解决方案,但大多数似乎过于复杂,我无法让任何东西正常工作或做我想做的事。
我有一个表中的数据,其中特定事物(房间)将具有名称,以及具有相应日期/时间(LogTimeStanp)的最新状态(AnalogValue;它与在线状态相关)。
我最感兴趣的是每个房间的当前在线状态,所以我只需要每个房间的最新行。
MAX(),SELECT DISTINCT,Group 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) 我有一个看起来像这样的表格(实际案例的过度简化案例来表明我的观点)
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) 我有下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)
我只想选择id和name最小Qty分组 by name,结果如下:
+----+--------+
| id | name |
+----+--------+
| …Run Code Online (Sandbox Code Playgroud) 无法理解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) 我有一个返回所需输出的查询。
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) 我有2张桌子
| 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 服务器
这不是我的工作,也不是我的家庭作业。我刚刚从 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)。我不明白。请帮忙。
简单查询:
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,所有数据都在一个分区上。
group-by ×10
mysql ×5
sql-server ×4
limits ×2
postgresql ×2
case ×1
count ×1
distinct ×1
join ×1
optimization ×1
order-by ×1
query ×1
sorting ×1
sum ×1