久久久久久久av_日韩在线中文_看一级毛片视频_日本精品二区_成人深夜福利视频_武道仙尊动漫在线观看

SQL - 如果滿足使用多個先前列的條件,則 LAG 以獲

SQL - LAG to get previous value if condition using multiple previous columns satisfied(SQL - 如果滿足使用多個先前列的條件,則 LAG 以獲取先前值)
本文介紹了SQL - 如果滿足使用多個先前列的條件,則 LAG 以獲取先前值的處理方法,對大家解決問題具有一定的參考價值,需要的朋友們下面隨著小編來一起學習吧!

問題描述

限時送ChatGPT賬號..

我有一個由以下人員創建的表:

I have a table created by:

CREATE TABLE #test_table 
(
id INT
,EventName VARCHAR(50)
,HomeTeam VARCHAR(25)
,Metric INT
)

INSERT INTO #test_table VALUES
(1, 'Team A vs Team B', 'Team A', 5),
(2, 'Team A vs Team B', 'Team A', 7),
(3, 'Team C vs Team D', 'Team C', 6),
(4, 'Team Z vs Team A', 'Team Z', 8),
(5, 'Team A vs Team B', 'Team A', 9),
(6, 'Team C vs Team D', 'Team C', 3),
(7, 'Team C vs Team D', 'Team C', 1),
(8, 'Team E vs Team F', 'Team E', 2)

結果:

id  EventName           HomeTeam    Metric
------------------------------------------
1   Team A vs Team B    Team A      5
2   Team A vs Team B    Team A      7
3   Team C vs Team D    Team C      6
4   Team Z vs Team A    Team Z      8
5   Team A vs Team B    Team A      9
6   Team C vs Team D    Team C      3
7   Team C vs Team D    Team C      1
8   Team E vs Team F    Team E      2

A 想要計算一個新列 PreviousMetricN,其中 N 可以是 1, 2, 3, ... 這顯示了 Metric 的前一個值,但前提是HomeTeam 參與了之前的活動.例如:

A want to calculate a new column PreviousMetricN where N can be 1, 2, 3, ... which shows the previous value for Metric, but only if the HomeTeam was involved in the previous event. For example:

id  EventName           HomeTeam    Metric  PreviousMetric1 PreviousMetric2
------------------------------------------------------------------------
1   Team A vs Team B    Team A      5       NULL            NULL
2   Team A vs Team B    Team A      7       5               NULL
3   Team C vs Team D    Team C      6       NULL            NULL
4   Team Z vs Team A    Team Z      8       NULL            NULL
5   Team A vs Team B    Team A      9       8               7
6   Team C vs Team D    Team C      3       6               NULL
7   Team C vs Team D    Team C      1       3               6
8   Team E vs Team F    Team E      2       NULL            NULL

我一直在嘗試使用 PARTITION BY 子句中的新分組變量的 LAG 變體,例如

I have been trying variations of LAG with a new grouping variable in the PARTITION BY clause such as

LAG(Metric) OVER(Partition by (CASE WHEN CHARINDEX(HomeTeam, EventName)>0 THEN 1 ELSE 0 END) ORDER BY id)

但沒有任何成功.這怎么辦?

but without any success. How can this be done?

我也在這里為熊貓問過這個問題:Pandas shift - 如果滿足多個條件,則獲取之前的值

I've also asked this question for Pandas here: Pandas shift - get previous value if multiple conditions satisfied

推薦答案

我在這里看不到使用窗口函數和單次掃描表格的答案.我們可以在單次掃描中執行此查詢,如下所示:

I see no answer here that uses window functions and a single scan of the table. We can do this query in a single scan as follows:

讓我們假設您在另一列中有 AwayTeam.

Let us assume you have the AwayTeam in another column.

如果你還沒有這個并且你想從 EventData 中解析它:
我們可以使用:SUBSTRING(EventData, CHARINDEX(' vs ', EventData) + 4)
我敦促您遵循適當的規范化并將其創建為表格中的適當列.

If you don't have this yet and you wanted to parse it out of EventData:
We could use: SUBSTRING(EventData, CHARINDEX(' vs ', EventData) + 4)
I urge you to follow proper normalization and create this as a proper column in your table.

我們的算法是這樣運行的:

Our algorithm runs like this:

  1. 使用CROSS APPLY
  2. 將兩個團隊相乘(逆透視)作為單獨的行
  3. 使用LAG計算之前的Metric,按合并后的Team列進行分區
  4. 過濾掉翻倍的行,這樣我們的原始行只有一行
  1. Multiply out (unpivot) the two teams as separate rows, using CROSS APPLY
  2. Calculate the previous Metrics using LAG, partitioning by the merged Team column
  3. Filter back down the doubled up rows, so that we only get a single row for each of our original ones

SELECT id, HomeTeam, AwayTeam, Metric, Prev1, Prev2, Prev3
FROM (

  SELECT *
    ,Prev1 = LAG(Metric, 1) OVER (PARTITION BY v.Team ORDER BY id)
    ,Prev2 = LAG(Metric, 2) OVER (PARTITION BY v.Team ORDER BY id)
    ,Prev3 = LAG(Metric, 3) OVER (PARTITION BY v.Team ORDER BY id)
    -- more of these ......
  FROM test_table
  CROSS APPLY (VALUES (HomeTeam, 1),(AwayTeam, 0)) AS v(Team,IsHome)
) AS t

WHERE IsHome = 1
-- ORDER BY id  --if necessary

重要的是,我們無需使用多種不同的排序、分區或排序,也無需使用自聯接即可完成此操作.只需一次掃描.

Importantly, we can do this without the use of multiple different sorts, partitions or ordering, and without the use of a self-join. Just a single scan.

結果:

<頭>
id家庭團隊客隊公制上一頁上一個上一個
1A隊B 隊5(空)(空)(空)
2A隊B 隊75(空)(空)
3C 組團隊 D6(空)(空)(空)
4Z 團隊A隊8(空)(空)(空)
5A隊B 隊9875
6C 組團隊 D36(空)(空)
7C 組團隊 D136(空)
8團隊 EF 團隊2(空)(空)(空)

這篇關于SQL - 如果滿足使用多個先前列的條件,則 LAG 以獲取先前值的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,也希望大家多多支持html5模板網!

【網站聲明】本站部分內容來源于互聯網,旨在幫助大家更快的解決問題,如果有圖片或者內容侵犯了您的權益,請聯系我們刪除處理,感謝您的支持!

相關文檔推薦

What SQL Server Datatype Should I Use To Store A Byte[](我應該使用什么 SQL Server 數據類型來存儲字節 [])
Interpreting type codes in sys.objects in SQL Server(解釋 SQL Server 中 sys.objects 中的類型代碼)
Typeorm Does not return all data(Typeorm 不返回所有數據)
Typeorm .loadRelationCountAndMap returns zeros(Typeorm .loadRelationCountAndMap 返回零)
How to convert #39;2016-07-01 01:12:22 PM#39; to #39;2016-07-01 13:12:22#39; hour format?(如何將“2016-07-01 01:12:22 PM轉換為“2016-07-01 13:12:22小時格式?)
MS SQL: Should ISDATE() Return quot;1quot; when Cannot Cast as Date?(MS SQL:ISDATE() 是否應該返回“1?什么時候不能投射為日期?)
主站蜘蛛池模板: 亚洲一区二区久久久 | 资源首页二三区 | 亚洲成人中文字幕 | 国产激情视频 | 精品久久久久久久久久久下田 | 国产精品久久久久久 | 日本久久久影视 | 91亚洲国产亚洲国产 | 91色视频在线观看 | 91精品国产欧美一区二区 | 欧美一级大片免费观看 | 国产偷录叫床高潮录音 | 免费av手机在线观看 | 免费观看av | 91在线网站| 99re超碰 | 欧美在线观看免费观看视频 | 久久久国产一区二区三区 | 国产欧美一区二区三区日本久久久 | 一级午夜aaa免费看三区 | 亚洲激情网站 | 中文字幕高清在线 | 激情视频中文字幕 | 久久亚洲欧美日韩精品专区 | 国产一区二区三区免费观看视频 | 国产欧美精品一区二区三区 | 在线观看黄色大片 | 国产精品久久久久久久久久久久午夜片 | 国产高清精品网站 | 欧美黑人狂野猛交老妇 | 国产激情在线 | 国产农村妇女毛片精品久久麻豆 | 国产在线拍偷自揄拍视频 | 蜜臀久久99精品久久久久野外 | 91精品在线播放 | 国产精品日韩在线观看一区二区 | 色资源站 | 三级视频在线观看电影 | 久久精品色欧美aⅴ一区二区 | 成人美女免费网站视频 | 国产a区 |