簡體   English   中英

MSSQL 查詢:如何按每個分區查找不正確的行?

[英]MSSQL query: how to find the incorrect row by each partition?

我需要根據邏輯找到不正確的行。

邏輯是:

  1. 如果孩子有排(我會打電話給第一排)

     | merit | fruit | vegetable | | --------- | ----- | --------- | | behaviour | apple | cucumber |

    然后在有優點的行=詩水果=蘋果必須只有蔬菜= cucumber (黃瓜沒有別的詞) (這是第二行)

     | merit | fruit | vegetable | | ----- | ----- | --------- | | poem | apple | cucumber |
  2. 第二行的 AND 時間間隔必須比第一行的時間早或晚 4 小時,作為正確示例:

     | child_id | date | merit | fruit | vegetable | | --------- | --------------- | --------- | ----- | --------- | | 2 | 1/26/2022 16:00 | poem | apple | cucumber | | 2 | 1/26/2022 18:00 | behaviour | apple | cucumber |

    如我們所見,間隔為 4 小時

我有桌子:

| child_id  | date            | merit       | fruit   | vegetable |
| --------- | --------------- | ----------- | ------- | --------- |
| 1         | 1/27/2022 14:00 | behaviour   | apple   | cucumber  |
| 1         | 1/27/2022 15:00 | poem        | apple   | carrot    |
| 1         | 1/27/2022 17:00 | sleep       | apple   | ginger    |
| 1         | 1/27/2022 20:00 | competition | berry   | tomatoe   |
| 2         | 1/26/2022 13:00 | sleep       | apricot | tomatoe   |
| 2         | 1/30/2022 13:00 | poem        | apple   | cucumber  |
| 2         | 1/29/2022 13:00 | poem        | apple   | cucumber  |
| 2         | 1/26/2022 16:00 | poem        | apple   | cucumber  |
| 2         | 1/26/2022 18:00 | behaviour   | apple   | cucumber  |
| 2         | 1/26/2022 19:00 | present     | apple   | broccoli  |
| 3         | 1/25/2022 11:00 | present     | orange  | cucumber  |
| 3         | 1/25/2022 13:00 | poem        | apple   | ginger    |
| 3         | 1/25/2022 15:00 | behaviour   | apple   | cucumber  |
| 4         | 1/26/2022 14:00 | behaviour   | apple   | cucumber  |
| 4         | 1/27/2022 21:00 | poem        | apple   | carrot    |
| 4         | 1/27/2022 15:00 | poem        | apple   | carrot    |
| 4         | 1/27/2022 20:00 | sleep       | apple   | ginger    |
| 4         | 1/27/2022 21:00 | competition | berry   | tomatoe   |

我期望的結果:

| child_id  | date             | merit | fruit | vegetable |
| --------- | --------------- | ----- | ----- | --------- |
| 1         | 1/27/2022 15:00 | poem  | apple | carrot    |
| 3         | 1/25/2022 13:00 | poem  | apple | ginger    |

我不知道如何按孩子找到這些行。 我寫了這個 SQL 並卡住了:

select * from example_1 where merit in ('behaviour', 'poem') 

我這里需要分區嗎?

在這種方法中,我們使用整理子查詢。 頂部查詢 B 為所需結果定義數據的非連接限制。 所以菜<>cucumber和功=詩

Exists 確保定義了第一行的限制並且存在非匹配項的相關性。 所以我們確保水果匹配,優點是“行為”,child_id 的匹配,並且日期的差異在 4 小時內。

DEMO-DB Fiddle UK

SELECT B.* 
FROM table B
WHERE vegetable <> 'cucumber'
  and merit = 'poem'
  and exists (SELECT 1 
              FROM Table A
              WHERE A.Fruit = B.Fruit
                AND A.Child_id = B.Child_ID
                AND A.merit = 'behaviour' 
                AND abs(Datediff(hour,A.Date,B.Date)) <=4)

給我們:

+----------+-------------------------+-------+-------+-----------+
| child_id |          date           | merit | fruit | vegetable |
+----------+-------------------------+-------+-------+-----------+
|        1 | 2022-01-27 15:00:00.000 | poem  | apple | carrot    |
|        3 | 2022-01-25 13:00:00.000 | poem  | apple | ginger    |
+----------+-------------------------+-------+-------+-----------+

一種可能的解決方案是使用 LEFT OUTER JOIN 將表連接到自身,然后只接受表的連接版本返回 null 的記錄:

SELECT e1.* 
FROM example_1 e1
   LEFT OUTER JOIN example_1 e2
       ON e1.fruit = e2.fruit
       AND e1.vegetable <> e2.vegetable
       AND e2.date BETWEEN DATEADD(HOUR, -4, e1.date) AND e1.date
       AND e2.merit = 'behavior'
WHERE e1.merit = 'poem'
   AND e2.child_id IS NULL 

訣竅主要在連接標准中,我們希望確保我們在“行為”和“詩歌”之間匹配vegetable ,同時還要檢查最后 4 小時。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM