【问题标题】:Get Records that have multiples in the same group获取同一组中有多个记录
【发布时间】:2020-12-12 07:53:46
【问题描述】:

我有一个客户会议列表,这些会议由 Python3.8 从所有已安排会议的 csv 文件中添加到 SQLite3 数据库中(每次安排新会议时都会手动下载该文件)。有时会重新安排会议,这会导致同一个人在该季度安排多次会议,即使每个客户每个季度只有一次“季度”会议,而且季度不是基于日历年而是因客户而异。有时除了定期的季度会议外,还会举行“特别”会议。日历将包含 Q1 到 Q4,但它可能从 Q2 开始并在 Q1 结束,具体取决于客户年份与日历年的下降情况。

所以我想做的是返回每个季度所有重复的客户会议,以便我可以手动删除/检查它们并标记为“特殊”或“其他”。 QTR 值由 Python 在添加记录时根据日期和客户个别年份的开始计算得出。

如果有其他方法可以做到这一点,我很乐意听到。

架构 (SQLite v3.30)

CREATE TABLE "Meetings" (
    "id_pk" INTEGER NOT NULL,
    "Hipaa" TEXT NOT NULL,
    "Meeting_Date"  TEXT NOT NULL,
    "CN_Date"   TEXT,
    "QTR"   TEXT,
    "Date_Added"    TEXT,
    "Annual"    TEXT,
    "FLAG"  TEXT,
    UNIQUE("Hipaa","Meeting_Date"),
    PRIMARY KEY("id_pk")
)

查询 #1

insert into Meetings ("Hipaa", "Meeting_Date", "QTR", "FLAG")
values 

( "JonesTom" , "2020-01-03" ,  "Q1" , "Regular" ),
( "JonesTom" , "2020-04-06" ,  "Q2" , "Regular" ),
( "JonesTom" , "2020-07-10" ,  "Q3" , "Regular" ),
( "JonesTom" , "2020-10-15" ,  "Q4" , "Regular" ),
( "JonesTom" , "2021-01-10" ,  "Q1" , "Regular" ),

( "ConnSar"  , "2020-02-04" ,  "Q1" , "Regular" ),
( "ConnSar"  , "2020-05-07" ,  "Q2" , "Regular" ),
( "ConnSar"  , "2020-08-11" ,  "Q3" , "Regular" ),
( "ConnSar"  , "2020-11-02" ,  "Q4" , "Regular" ),
( "ConnSar"  , "2020-11-16" ,  "Q4" , "Regular" ),
( "ConnSar"  , "2021-02-12" ,  "Q1" , "Regular" ),

( "ZuckMark"  , "2019-01-14" , "Q3" , "Regular" ),
( "ZuckMark"  , "2019-01-17" , "Q3" , "Regular" ),
( "ZuckMark"  , "2020-05-20" , "Q4" , "Regular" ),
( "ZuckMark"  , "2020-07-05" , "Q1" , "Regular" ),
( "ZuckMark"  , "2020-07-21" , "Q1" , "Regular" ),
( "ZuckMark"  , "2020-10-20" , "Q2" , "Regular" ),
( "ZuckMark"  , "2020-11-06" , "Q2" , "Regular" ),
( "ZuckMark"  , "2020-01-02" , "Q3" , "Regular" )
;

查询 #2

select * from Meetings;
| id_pk | Hipaa    | Meeting_Date | CN_Date | QTR | Date_Added | Annual | FLAG    |
| ----- | -------- | ------------ | ------- | --- | ---------- | ------ | ------- |
| 1     | JonesTom | 2020-01-03   |         | Q1  |            |        | Regular |
| 2     | JonesTom | 2020-04-06   |         | Q2  |            |        | Regular |
| 3     | JonesTom | 2020-07-10   |         | Q3  |            |        | Regular |
| 4     | JonesTom | 2020-10-15   |         | Q4  |            |        | Regular |
| 5     | JonesTom | 2021-01-10   |         | Q1  |            |        | Regular |
| 6     | ConnSar  | 2020-02-04   |         | Q1  |            |        | Regular |
| 7     | ConnSar  | 2020-05-07   |         | Q2  |            |        | Regular |
| 8     | ConnSar  | 2020-08-11   |         | Q3  |            |        | Regular |
| 9     | ConnSar  | 2020-11-02   |         | Q4  |            |        | Regular |
| 10    | ConnSar  | 2020-11-16   |         | Q4  |            |        | Regular |
| 11    | ConnSar  | 2021-02-12   |         | Q1  |            |        | Regular |
| 12    | ZuckMark | 2019-01-14   |         | Q3  |            |        | Regular |
| 13    | ZuckMark | 2019-01-17   |         | Q3  |            |        | Regular |
| 14    | ZuckMark | 2020-05-20   |         | Q4  |            |        | Regular |
| 15    | ZuckMark | 2020-07-05   |         | Q1  |            |        | Regular |
| 16    | ZuckMark | 2020-07-21   |         | Q1  |            |        | Regular |
| 17    | ZuckMark | 2020-10-20   |         | Q2  |            |        | Regular |
| 18    | ZuckMark | 2020-11-06   |         | Q2  |            |        | Regular |
| 19    | ZuckMark | 2020-01-02   |         | Q3  |            |        | Regular |

期望的结果

| id_pk | Hipaa    | Meeting_Date | CN_Date | QTR | Date_Added | Annual | FLAG    |
| ----- | -------- | ------------ | ------- | --- | ---------- | ------ | ------- |
| 9     | ConnSar  | 2020-11-02   |         | Q4  |            |        | Regular |
| 10    | ConnSar  | 2020-11-16   |         | Q4  |            |        | Regular |
| 12    | ZuckMark | 2019-01-14   |         | Q3  |            |        | Regular |
| 13    | ZuckMark | 2019-01-17   |         | Q3  |            |        | Regular |
| 15    | ZuckMark | 2020-07-05   |         | Q1  |            |        | Regular |
| 16    | ZuckMark | 2020-07-21   |         | Q1  |            |        | Regular |
| 17    | ZuckMark | 2020-10-20   |         | Q2  |            |        | Regular |
| 18    | ZuckMark | 2020-11-06   |         | Q2  |            |        | Regular |

View on DB Fiddle

【问题讨论】:

    标签: sql sqlite duplicates subquery python-3.8


    【解决方案1】:

    如果我理解正确,您希望在 (hipaa, qtr) 上重复。你可以使用exists:

    select m.*
    from meetings m
    where exists (
        select 1 
        from meetings m1 
        where m1.hipaa = m.hipaa and m1.qtr = m.qtr and m1.id_pk <> m.id_pk
    )
    

    另一个选项是窗口计数:

    select *
    from (
        select m.*, count(*) over(partition by hipaa, qtr) cnt
        from meetings m
    ) m
    where cnt > 1
    

    【讨论】:

    • 我能够修改以包含年份,因此不同的年份不算重复,然后使用 FLAG 列标记我已修复的那些。 ` 删除视图“MTG_Dupes”; ` ` Create View "MTG_Dupes" as ` ` select * ` from ( ` ` select m.*, count(*) over(partition by Hipaa_Short, Meeting_Type, strftime('%Y', Meeting_Date) ) cnt ` ` from meeting m 其中 FLAG = "REGULAR" ` ` ) m ` ` 其中 cnt > 1 ; `
    【解决方案2】:

    EXISTS:

    select m.* from Meetings m
    where exists (
      select 1 from Meetings 
      where Hipaa = m.Hipaa 
      and strftime('%Y', Meeting_Date) = strftime('%Y', m.Meeting_Date)
      and QTR = m.QTR 
      and id_pk <> m.id_pk
    )
    

    请参阅demo

    【讨论】:

    • 我还需要年份是独一无二的,因此 2019 年第一季度的某些东西不会与 2020 年第一季度的某些东西重复。
    • @ThatChrisGuy id_pk 为 1、5、6 的行不应该在您的预期结果中。
    猜你喜欢
    • 2020-10-09
    • 1970-01-01
    • 1970-01-01
    • 2011-07-30
    • 1970-01-01
    • 2010-12-31
    • 1970-01-01
    • 2011-07-06
    • 2016-06-07
    相关资源
    最近更新 更多