我想要对SQL Server 2008进行以下查询:
SELECT *
FROM INQUIRY_TABLE
WHERE inquiryid >100
AND inquiryid < 200
ORDER BY inquiryid ASC, actionNum ASC
但是可能有重复的inquiryid
结果。如果actionNum
是重复的,我只想要第一个(最小的inquiryid
)查询。我该怎么办?
谢谢
答案 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