我们正在创建一个仓库系统。在这个系统中,我们将有一个提取页面(我不知道这个词是否适合描述它,但它与我们银行账户中的日志相同,我们在那里进行所有交易,带有值,然后,将其减去总价值,我猜这是银行提取物)。
我们需要一张像这样的表:
该表将包含来自财务票据的所有交易(包括产品的进入和退出)。如果您注意到,您可以看到ID1 将出现在位置 1、2 和 4。我确实尝试使用LAG,但使用该LAG函数,它获得了ID3 值。
如何获得滞后值,但具有所需的产品 ID?我需要totalPR_ID = 1的最后一个值。
我试过这个:
begin tran
insert into almoxarifado.Movimentacao
(produto_id,documento,data,saldo_anterior,entradas,saidas)
select
Lotes.produto_id as produto_id,
NF.numero as documento,
nf.data_cadastro as data,
>>The lag value would be here, I need this field, to be the last total value,
>>but from this specific product.
Lotes.quantidade as entradas,
0 as saidas
from Almoxarifado.Entradas
join Compras.Notas_Fiscais NF on Entradas.nota_fiscal_id = NF.id
join Compras.Notas_Fiscais_Produtos NFP on NFP.nota_fiscal_id …Run Code Online (Sandbox Code Playgroud) 我想知道是否可以使用over (partition by...)子句以避免在下面的示例中使用子选择:
declare @t table (
id int
,code char(2)
,descriptor int
)
insert into @t
select 1, 'a1', 10
union select 1, 'a1', 20
union select 1, 'a1', 30
union select 2, 'b1', 10
union select 2, 'b1', 20
union select 2, 'b1', 30
union select 2, 'b2', 10
union select 2, 'b2', 20
union select 2, 'b2', 30
union select 3, 'c4', 10
union select 3, 'c4', 20
union select 3, 'c4', 30
union select …Run Code Online (Sandbox Code Playgroud) 我有一个查询,其中包含一个RANK() OVER函数,但我想在后面的 WHERE 子句中使用此列上显示的结果。我怎么写,因为我看过的所有其他问题都没有,RANK() OVER而且似乎更容易做到。这是声明:
USE SMSResults
SELECT Student_No,Result,Module_Name,Semester,Year,RANK() OVER (PARTITION BY Student_No ORDER BY Semester DESC) AS Rnk
FROM tbl_results
WHERE Student_No = '201409'
ORDER BY Year DESC
Run Code Online (Sandbox Code Playgroud)
我想使用子句中的Rnk列WHERE
我有一个包含两个字段的表:时间和值,它们都是整数,我想找到值大于 0 的连续周期,然后用连续整数标记“值> 0”周期。
例如,如果我有这样的输入表:
我想要这样的输出表:
使用三个 CTE 和两个 row_number() 函数,我能够做到这一点。但是我觉得查询太麻烦了。有没有人有更优雅的代码来做到这一点?
我正在使用 sql server 2016 开发人员版。
这是我的代码:
CREATE TABLE #test1(
[time] [int] NULL,
[value] [int] NULL
)
insert into #test1
values(1,0),(2,0),(3,1),(4,0)
,(5,1),(6,2),(7,0),(8,0)
,(9,1),(10,2),(11,3),(12,0)
,(13,0),(14,0),(15,1),(16,0);
;with a1 as
(select *, [time] - row_number() over (order by [time]) as group_num
from #test1
where value>0),
a2 as
(select distinct group_num from a1
),
a3 as
(select group_num, row_number() over (order by group_num) as group_id
from a2)
select a1.*, a3.group_id
from a1 left join …Run Code Online (Sandbox Code Playgroud) 在这个答案中,Erwin Brandstetter 说:
count(step OR NULL) OVER (ORDER BY date)是最短的语法,也适用于 Postgres 9.3 或更早版本。count()只计算非空值。在现代 Postgres 中,更简洁、等效的语法是:Run Code Online (Sandbox Code Playgroud)count(step) FILTER (WHERE step) OVER (ORDER BY date)
我不确定为什么count(step OR NULL)是首选。在我的查询中,我执行以下操作。我重命名了我的变量以匹配他的同时保持语法。
CASE WHEN lag(id_type) OVER (ORDER BY date) <> id_type THEN 1 END AS step
Run Code Online (Sandbox Code Playgroud)
我们正在计算它返回的值。请注意,case 只能返回 1 或 null。
欧文的回答是:
这假设涉及的列是
NOT NULL. 否则你需要做更多。
所以我更迷茫了。添加count(step OR NULL)什么来保护我们的查询有什么意义?
任何人都可以分解这一点,也许可以展示两个带有数据的示例,其中只有一个 - 一个 -count(x OR NULL)有效?
我确定我错过了一个明显的解决方案,但我正在尝试总结由显式组号和隐式排序定义的组的值。我敢肯定这不会让这更清楚,所以假设我有这个示例源堆表:
GroupID Value
----------- -----------
1 5
1 5
1 3
2 4
2 1
1 4
2 3
2 5
2 2
1 1
Run Code Online (Sandbox Code Playgroud)
我想要一个为我提供以下结果的查询:
GroupID Values
----------- -----------
1 13
2 5
1 4
2 10
1 1
Run Code Online (Sandbox Code Playgroud)
隐含的排序是我还没有找到解决方法的挑战...... 任何帮助,将不胜感激。
我希望我可以使用类似于以下的查询创建一个确定性的行排序:
SELECT *
, ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) AS RowNum
FROM Table WITH(TABLOCK)
OPTION (MAXDOP 1)
Run Code Online (Sandbox Code Playgroud)
我希望这会强制分配顺序扫描,然后会给我一个确定性的行顺序。
可悲的是,我一直坚持使用数据。我这里没有其他指标,例如日期等,可以提供任何设定的顺序。我希望上面概述的技巧就足够了,但我不完全确定它会。
编辑:只是为了结束这个,因为我知道有关于我为什么问这个问题的问题,我有一系列按月/年命名的堆表,其中包含业务想要总结的行项目金额按天(它们与我问题中的隐含组相关)。因为有效地执行此操作看起来不可行,所以我们决定在月(例如表)级别进行聚合,因此这篇文章帮助我证明了对业务需求的更改是合理的。感谢大家的投入!
我的数据包含 ID、状态和时间 (hh:mm:ss)。
我需要计算每个“位置”和“隧道外”状态之间的总时间
ID || time || Status
________________________________________________
1 || 08:09:14 || Out of Tunnel
2 || 08:10:59 || Location
3 || 08:11:42 || Out of Tunnel
4 || 08:11:55 || Location
5 || 08:16:36 || Location
6 || 09:41:36 || Location
7 || 09:43:10 || Out of Tunnel
8 || 09:43:19 || Location
Run Code Online (Sandbox Code Playgroud)
“位置”状态标记我需要开始计数的位置。我需要在下次状态为“隧道外”时停止计数。如果没有给出相应的'Out of Tunnel',则不要计算它。
然后将每个总数相加以得出总计。例如:
考虑以下查询:
\n\nSELECT\n country\n , count(id) AS "count"\nFROM\n lead\nWHERE\n date_part(\'year\', lead.since) = date_part(\'year\', CURRENT_DATE)\nGROUP BY "country"\nORDER BY "count" DESC\n;\nRun Code Online (Sandbox Code Playgroud)\n\n它返回类似以下内容:
\n\ncountry count\nfr 3456\nus 569\nsc 248\n\xe2\x80\xa6\nRun Code Online (Sandbox Code Playgroud)\n\n如何添加第三列以及占总计数的百分比?
\n我有许多表,都包含属性aid,bid,cid和xid整数类型,其他属性可能不同。对于每个(给定)表T,我想根据aid,bid,cid升序和更新列对行进行排序xid,增量值从 0 开始。实现这一目标的最佳方法是什么?
我目前的解决方案包括:
TxidT_tempTT_temp到T由于这些表具有不同的模式,我编写了一半代码PL/pgSQL,一半代码使用 bash 脚本编写。
问题 1:任何评论如何让它在纯 PL/pgSQL 中编程?
问题 2:任何评论如何更优雅地实现?
假设我有一个包含架构的表:
id value
1 0.3
2 0.6
5 0.1
4 0.7
Run Code Online (Sandbox Code Playgroud)
由...提供
CREATE TABLE foo AS
SELECT * FROM (
VALUES (1,0.3::float),(2,0.6),(5,0.1),(4,0.7)
) AS x(id, value)
Run Code Online (Sandbox Code Playgroud)
我想离散值列。
这个想法是对值进行排序,并将 1 与前半部分相关联,将 2 与第二部分相关联。
id value normalized
1 0.3 1
2 0.6 2
5 0.1 1
4 0.7 2
Run Code Online (Sandbox Code Playgroud)
我不知道如何在 SQL 中做到这一点,有什么帮助吗?
PS:我正在使用 Postgres,所以任何依赖 Postgres 的解决方案也可以
window-functions ×10
sql-server ×6
postgresql ×4
count ×2
cte ×1
group-by ×1
null ×1
order-by ×1
scripting ×1
t-sql ×1
update ×1