簡體   English   中英

具有連續重復項的查詢結果已刪除

[英]Query results with consecutive duplicates remove

嗨,我想知道如何從基於單列的查詢結果中刪除連續的重復項。 在這種情況下,null表示他們不想購買任何東西,因此單擊后退按鈕。 我想要買家提供的商品變更歷史記錄,以及最早的購買信息。

在buy_date之前從項目訂單中選擇項目,買方,buy_date

item           buyer           buy_date
null           Sam             04/24/2016
Lipstick       Anna            05/31/2016
Charger        Tim             06/01/2016
Charger        James           06/03/2016
null           Tim             06/03/2016
null           James           06/04/2016
Nail Polish    Sarah           06/04/2016

這是測試結果的示例。

現在我的新結果應該是

item           buyer           buy_date
null           Sam             04/24/2016
Lipstick       Anna            05/31/2016
Charger        Tim             06/01/2016
null           Tim             06/03/2016
Nail Polish    Sarah           06/04/2016

僅保留連續重復項中的第一個。 我沒有刪除任何記錄。 我只是過濾出結果,以便刪除連續的重復項。

  1. 如何在通用ANSI-SQL中執行此操作?
  2. 如果不可能,那么三大SQL供應商有沒有辦法做到這一點?

您可以使用ANSI標准窗口功能執行此操作。 一種方法使用lag()獲得前一項。 然后,它匯總項目更改的次數,並使用此信息來查找每個組中的第一行:

select r.*
from (select r.*, row_number() over (partition by grp order by date) as seqnum
      from (select r.*,
                   sum(case when prev_item = item then 0 else 1 end) over (order by buy_date) as grp
            from (select r.*, lag(item) over (order by buy_date) as prev_item
                  from results r
                 ) r
           ) r
     ) r
where seqnum = 1;

我想不到那個。 您只需要lag()

select r.*
from (select r.*, lag(item) over (order by buy_date) as prev_item
      from results r
     ) r
where prev_item is null or prev_item <> item;

盡管我可能沒有理解這個問題,但我會說,最簡單的方法是根據其名稱僅提取一個唯一的項目,以便在該字段上使用DISTINCT。 因此,新查詢如下所示:

select DISTINCT(item), buyer, buy_date from item order by buy_date

編輯:沒關系。 我看到這個問題專門針對連續結果。 請參閱戈登的回應。

請注意,MySQL沒有lag()函數,但我確實設法找到了這篇文章來模擬一個: 模擬MySQL中的lag函數

祝好運!

這是一個通用查詢,如果它們不支持lagpartition by功能partition by (例如在MySQL中),則可以在任何數據庫上使用

select ITEM,BUYER,BUY_DATE from 
(
    select t1.item,
    max(t1.buyer) as buyer,
    max(t1.buy_date) as buy_date,
    count(*) as cnt
    from myTable t1
      inner join myTable t2
    on t1.item=t2.item
      and t1.buy_date <=t2.buy_date
    group by t1.item,t1.buy_date
)
where cnt=1

內部查詢將基於buy_date得出計數,因此它將為每個item提供最新記錄。 如果您希望以其他方式返回結果,則可以將連接條件更改為t1.buy_date >=t2.buy_date

內部查詢將為您提供如下輸出。

+-------------+-------+----------------------+-----+
|    ITEM     | BUYER |       BUY_DATE       | CNT |
+-------------+-------+----------------------+-----+
| Lipstick    | Anna  | 31-MAY-2016 00:00:00 |   1 |
| Charger     | James | 03-JUN-2016 00:00:00 |   1 |
| Charger     | Tim   | 01-JUN-2016 00:00:00 |   2 |
| Nail Polish | Sarah | 04-JUN-2016 00:00:00 |   1 |
+-------------+-------+----------------------+-----+

現在在外部查詢中,給條件cnt=1只能獲取不同的記錄。

暫無
暫無

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

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