计算按给定列划分的唯一不同值

时间:2020-02-05 08:12:44

标签: sql sql-server

如何转换此输入表:

"DENL": false
"NLES": false
"NLUS": true
"USNL": true
"AEGB": true
"ITAE": true
"ITFR": false

到sql中的以下输出:

╔════════════════╦══════════════════════╗
║ conversationId ║ LengthOfCOnversation ║
╠════════════════╬══════════════════════╣
║              1 ║                    1 ║
║              1 ║                    2 ║
║              1 ║                    2 ║
║              1 ║                    5 ║
║              1 ║                    5 ║
║              1 ║                    5 ║
║              1 ║                    5 ║
║              1 ║                    5 ║
║              1 ║                    1 ║
║              1 ║                    3 ║
║              1 ║                    3 ║
║              1 ║                    3 ║
║              2 ║                    1 ║
║              2 ║                    2 ║
║              2 ║                    2 ║
║              3 ║                    2 ║
║              3 ║                    2 ║
║              4 ║                    1 ║
╚════════════════╩══════════════════════╝

我们正在尝试将输入中的相同╔════════════════╦══════════════════════╗ ║ conversationId ║ LengthOfCOnversation ║ ╠════════════════╬══════════════════════╣ ║ 1 ║ 1 ║ ║ 1 ║ 2 ║ ║ 1 ║ 5 ║ ║ 1 ║ 1 ║ ║ 1 ║ 3 ║ ║ 2 ║ 1 ║ ║ 2 ║ 2 ║ ║ 3 ║ 2 ║ ║ 4 ║ 1 ║ ╚════════════════╩══════════════════════╝ 分组为每个LengthOfConversation中的一个。

1 个答案:

答案 0 :(得分:2)

您需要一个列来确定行的顺序,如果我正确理解了这个问题,则以下方法是一种可能的解决方案。请注意,在示例中,Id列确定行的顺序。

表格:

CREATE TABLE Data (
   Id int IDENTITY(1, 1),
   ConversationId int,
   LenOfConversation int
)
INSERT INTO Data
   (ConversationId, LenOfConversation)
VALUES
   (1, 1),
   (1, 2),
   (1, 2),
   (1, 5),
   (1, 5),
   (1, 5),
   (1, 5),
   (1, 5),
   (1, 1),
   (1, 3),
   (1, 3),
   (1, 3),
   (1, 3),
   (1, 2)

声明:

SELECT 
   ConversationId, LenOfConversation
FROM (   
   SELECT
      Id,
      ConversationId,
      LenOfConversation,
      LAG(LenOfConversation) OVER (PARTITION BY ConversationId ORDER BY Id) AS LenOfConversation_Prev
   FROM Data
) t
WHERE (LenOfConversation_Prev IS NULL) OR (LenOfConversation <> LenOfConversation_Prev)
ORDER BY Id

结果:

ConversationId  LenOfConversation
1               1
1               2
1               5
1               1
1               3
1               2