我熟悉如何聚合行,如这个答案所示:
我还熟悉如何使用 HAVING 子句过滤聚合结果。
我似乎无法理解(因此它会粘住)是如何根据值或比较其他行来过滤行,而不聚合它们。
我知道答案涉及一些有关窗口函数或窗口子句的内容,事实上我以前已经成功完成过。但我似乎并没有记住它是如何运作的;我觉得我错过了一些基本的东西。
举个例子,信息如下:
fruit_name | some_field
------------+------------
apple | 3.25
apple | 6.8
apple | 0.7
orange | 2.6
banana | 3.5
banana | 2.49
cherry | 1
grapefruit | 2.6
grapefruit | 2.7
Run Code Online (Sandbox Code Playgroud)
我想要获取行数(按水果名称)大于 1 的所有行,因此它应该如下所示:
fruit_name | some_field
------------+------------
apple | 3.25
apple | 6.8
apple | 0.7
banana | 3.5
banana | 2.49
grapefruit | 2.6
grapefruit | 2.7
Run Code Online (Sandbox Code Playgroud)
执行此操作的正确惯用方法是什么?
(如果可能的话,我想要一个 SQL 标准答案,如果有一种更简单的 Postgres 特定方法来做到这一点,我也想知道。)
我有两张桌子,一张是Category,另一张是Product。
表说明有
类别
产品
category_id(类别表的外键)
我想在单个产品上显示所有类别以及相关产品。因此,为了获取关联的类别,我使用以下查询。我可以在自引用表中进行左连接,但无法获取产品数据列表,因为这是一个子查询,而子查询只会返回单个列。
select
cat1.id, ARRAY(select name, type, description from product where
product.category_id = cat1.id)
as category_1_products_data,
cat2.id, ARRAY(select name, type, description from product where
product.category_id = cat2.id)
as category_2_products_data,
cat3.id, ARRAY(select name, type, description from product where
product.category_id = cat3.id)
as category_3_products_data
from category cat1
left join category cat2
on cat2.parent_id = cat1.id
left join category cat3
on cat3.parent_id = cat2.id
where cat1.parent_id is …Run Code Online (Sandbox Code Playgroud)有一个包含 25.000.000 个条目的表,我有以下查询,该查询每 2 秒启动一次,这会导致非常高的负载(在 Amazon AWS 中高达 40 AAS)。执行时间需要20秒到5分钟,甚至会导致用户浏览器超时,掉线率很高。
SELECT COUNT ( * ) AS `chk`
FROM ( SELECT `item_id`
FROM `items`
WHERE `item_status` IN (...)
AND `item_type` = ?
AND `user_id` != ?
AND `item_name` IN (...)
LIMIT 3
) AS OTHERS
;
Run Code Online (Sandbox Code Playgroud)
索引优化已完成 - 、、 和user_id均已item_name建立索引(每列一个索引)。item_typeitem_status
更多信息:
varchar128请注意,在大约 50% 的情况下,MySQL 必须检查完整的表,因为找到的项目少于 3 个。因此,该限制仅在商品数量超过 3 件的情况下才有用。 …
我们正在运行 10.2.44-MariaDB-log MariaDB 服务器。现在我正在创建具有这种结构的表
Primary('id')
UniqueIndex('colA', 'colB', 'colc');
Index('cola')
Index('colb')
Index('colc')
Run Code Online (Sandbox Code Playgroud)
我想知道,为每一列设置这些索引是否有意义?这些列可以像Select cola或一样合法地查询JOIN ON cola,但是服务器是否知道在这些情况下使用索引,或者它是否使用唯一索引,因为这些列已经在那里了?
我有一个 SQL Server 2019 表,其中包含某些年份的行:
with data (year_, amount) as (
select 2024, 100 union all
select 2025, 200 union all
select 2025, 300 union all
select 2026, 400 union all
select 2027, 500 union all
select 2028, 600 union all
select 2028, 700 union all
select 2028, 800 union all
select 2029, 900 union all
select 2031, 100
)
select * from data
YEAR_ AMOUNT
---------- ----------
2024 100
2025 200
2025 300
2026 400
2027 500
2028 600 …Run Code Online (Sandbox Code Playgroud) 我正在处理一个 SQL 查询,它根据过去的购买(行业是场地票务)将客户历史记录放在一起。报告将是大的,类似于 80-90 列,输出 CSV 中的每个事件或每个记录的事件类别一列。
数据库结构要求我使用嵌套的 select 语句将必要的数据放入每条记录的列中——每列包含该类型事件的票证数量。我在理论上知道如何执行此操作,但是每个嵌入的 select 语句都非常大,以至于完整报告将突破我的数据库界面上的 8,000 个字符限制。这些语句之一如下所示:
(select count (*)
FROM
guest ig, event2 e, eventseat es, "order" o
WHERE ig.guestid = g.guestid
and ig.guestid = o.guestid
and o.orderid = es.orderid
and e.eventid = es.eventid
and e.incometype = 'T'
and e.eventtype in ('SS', 'BMF')
and es.status in ('2','4')
and es.price <> '0.00'
and es.price <> '5.00'
and e.year = '2010' <-- THESE LINES ARE THE ONLY ONES THAT
and e.run in ('SS-DANCE') <-- …Run Code Online (Sandbox Code Playgroud) USE [RF_WORLD]
GO
/****** Object: Trigger [dbo].[lastdeathtrigg] Script Date: 08/20/2012 10:52:58 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author: Mauro Tamm
-- =============================================
ALTER TRIGGER [dbo].[lastdeathtrigg]
ON [dbo].[tbl_pvporderview]
AFTER UPDATE
AS
IF (UPDATE(Death))
BEGIN
SET NOCOUNT ON;
DECLARE @userserial int;
SELECT @userserial ='serial' WHERE UPDATE(Death)
Insert INTO [RF_WORLD].[dbo].[lastdeath]
(serial)
VALUES (@userserial)
END
Run Code Online (Sandbox Code Playgroud)
where 部分是可疑的,它会像那样工作吗?本质上,如果它实际更新,我只需要它选择行序列值。
我有一个选择,通过连接查找一些数据。系统运行Oracle 10.02g,选择如下
SELECT distinct t1.crit
FROM table_name1 t1
INNER JOIN table_name2 t2
ON t1.crit = t2.crit
WHERE NVL (t2.qty, 0) + NVL (t2.adds, 0) - NVL (t2.remove, 0) > 0
AND t1.process_id = 'some_process_id'
AND t1.item_no = 'some item NO'
AND t1.to_gen = 1
Run Code Online (Sandbox Code Playgroud)
其中 t1 在 (item_no, crit) 上有一个索引,t2 在 (item_no, crit, X) 上有一个索引,X 是一些附加列。
此语句的目的是找到我需要在附加表中为其生成数据的所有候选对象。当新数据生成后,t1.to_gen 列被设置为0。目前还不清楚,如果运行这个语句的软件进行中间提交,例如为一个item_no 生成一些新数据,设置t1。 to_gen = 0 并提交,然后使用相关语句的游标中的下一个 item_no。
该语句在我的环境中每天成功执行几次,但在极少数情况下,我从 oracle 收到错误,我不清楚其来源:
ora-01410: invalid RowID
Run Code Online (Sandbox Code Playgroud)
由于 select 语句不直接使用伪列 RowID,Oracle 将不得不在内部使用它。
这个问题的根源是什么?
更新:听起来很可悲,系统会进行中间提交,但这不是问题的根源。
我有一个疑问:
select qid,ansid,ans from table1 where askerid='something'
Run Code Online (Sandbox Code Playgroud)
此查询可以检索许多行。但我想一次只显示 50 行,然后如果用户单击more,则应检索接下来的 50 行。我想到了这样的查询:
select qid,ansid,ans
from table1
where askerid='something'
limit 100
minus
select qid,ansid,ans
from table1
where askerid='something'
limit 50
Run Code Online (Sandbox Code Playgroud)
我想知道这是否是一个良好的查询性能和替代查询,其性能优于上述查询。
你能帮我解决一个问题吗。任务是在 MySQL 数据库中插入一条记录。条款:
表 'NETFLOW'.'Month' 中的关键列是:
事情是尽快查询,如果可能的话,在一个查询中。
当前查询的文本是:
INSERT INTO `netflow`.`Month` (`Year`, `Month`, `Day`, `Hour`, `srcaddr`,`dstaddr`, `doctets`)
(
SELECT
YEAR( FROM_UNIXTIME( `unix_secs` ) ) AS `YEAR`,
MONTH( FROM_UNIXTIME( `unix_secs` ) ) AS `MONTH`,
DAYOFMONTH( FROM_UNIXTIME( `unix_secs` ) ) AS `DAY`,
HOUR( FROM_UNIXTIME( `unix_secs` ) ) AS `HOUR`,
`srcaddr` ,
`dstaddr` ,
`doctets`
FROM `netflow`.`raw`
WHERE `unix_secs` <= 1394179200
GROUP BY
`YEAR`,
`MONTH`,
`DAY`,
`HOUR`,
`srcaddr`,
`dstaddr`
)
ON …Run Code Online (Sandbox Code Playgroud) select ×10
mysql ×3
postgresql ×3
sql-server ×3
index ×2
corruption ×1
duplication ×1
insert ×1
join ×1
mariadb ×1
oracle-10g ×1
performance ×1
query ×1
subquery ×1
trigger ×1
update ×1
view ×1