如果按语句排序重复,则选择第一个元素

时间:2018-11-27 16:03:22

标签: sql sql-server-2008 sql-order-by

我想要对SQL Server 2008进行以下查询:

SELECT * 
FROM INQUIRY_TABLE 
WHERE inquiryid >100 
  AND inquiryid < 200 
ORDER BY inquiryid ASC, actionNum ASC

但是可能有重复的inquiryid结果。如果actionNum是重复的,我只想要第一个(最小的inquiryid)查询。我该怎么办?

谢谢

3 个答案:

答案 0 :(得分:3)

将查询ID上的记录分组在一起可以解决问题。您没有在此表中指定字段,但如果仅希望这两个字段,则此查询将起作用。如果要检索的唯一字段超出此范围,则应查看其他答案以获取更深入的解决方案。

SELECT inquiryid, MIN(actionNum)
FROM INQUIRY_TABLE 
WHERE inquiryid >100 
    and inquiryid < 200 
GROUP BY inquiryid
ORDER BY inquiryid asc, actionNum asc

答案 1 :(得分:2)

不确定它是否适用于2008版本,但是您可以使用top 1 with ties

SELECT TOP 1 WITH TIES *
FROM INQUIRY_TABLE 
WHERE inquiryid >100 
and inquiryid < 200 
ORDER BY ROW_NUMBER() OVER(PARTITION BY inquiryid ORDER BY actionNum)

虽然这是最简单的查询,但不一定会保留您在问题中指定的顺序。如果此顺序很重要,则最好使用Zaynul的答案(尽管出于可读性考虑,我更喜欢使用cte而不是派生表)。

答案 2 :(得分:0)

使用ROW_NUMBER()窗口功能

SELECT * 
FROM
    (SELECT 
         *,
         ROW_NUMBER() OVER (PARTITION BY inquiryid ORDER BY actionNum) rn
     FROM 
         INQUIRY_TABLE 
     WHERE 
         inquiryid > 100 
         AND inquiryid < 200) t 
WHERE
    rn = 1

或相关子查询:

SELECT 
    t1.* 
FROM
    INQUIRY_TABLE t1
WHERE
    actionNum = (SELECT MIN(actionNum) 
                 FROM INQUIRY_TABLE t2 
                 WHERE t1.inquiryid = t2.inquiryid)
    AND t1.inquiryid > 100 
    AND t1.inquiryid < 200