我是SQL Server的新手,所以我现在道歉。
我有一个表格,我想要GroupBy field1
并返回field2
字段中关联计数最高的counted
记录。我通常在MS ACCESS中使用2个查询执行此操作,第一个查询以降序返回数据,第二个查询使用First()函数选择第一个记录,如下所示: -
查询1
SELECT t.field1, t.field2, Count(t.counted) AS count1
FROM Table1 AS t
WHERE (((t.counted)=2))
GROUP BY t.field1, t.field2
ORDER BY t.field1, Count(t.counted) DESC;
查询2(基于上面的查询1)
SELECT q.field1, First(q.field2) AS firstoffield2
FROM q
GROUP BY q.field1;
SOURCE DATA and query results I am looking for
我很难在SQL Server 2008查询中尝试完成与上述相同的结果。有人可以帮忙吗? (请提供我需要使用的精确SQL。)
以下是数据的子集和结果示例: -
表1
field1 ¦ field2 ¦ counted
10 ¦ 20 ¦ 2
10 ¦ 30 ¦ 2
10 ¦ 20 ¦ 2
20 ¦ 30 ¦ 0
20 ¦ 40 ¦ 0
20 ¦ 50 ¦ 1
20 ¦ 50 ¦ 2
20 ¦ 60 ¦ 1
Query1结果(按字段1分组,计数“计数”字段记录为“2”)
field1 ¦ field2 ¦ count1
10 ¦ 20 ¦ 2
10 ¦ 30 ¦ 1
20 ¦ 50 ¦ 1
查询2结果(我希望从SQL获得的输出)
field1 ¦ firstoffield2
10 ¦ 20
20 ¦ 50
我希望有所帮助,谢谢你们。
答案 0 :(得分:6)
WITH
q AS
(
Put your query one here
)
,
sequenced AS
(
SELECT
ROW_NUMBER() OVER (PARTITION BY field1 ORDER BY count1 DESC) AS sequence_id,
*
FROM
q
)
SELECT
*
FROM
sequenced
WHERE
sequence_id = 1
要将此更改为LAST(),请更改ROW_NUMBER()函数中的顺序方向。
答案 1 :(得分:0)
这不是我写过的最优雅的查询,但是这样的事情怎么样:
SELECT qSource.Field1, qSource.Field2
FROM (SELECT Field1, Field2, COUNT(Counted) AS Count1
FROM dbo.Table1
WHERE Counted = 2
GROUP BY Field1, Field2)qSource
INNER JOIN (SELECT q.Field1,MAX(q.Count1) AS HighestCount
FROM (SELECT Field1, Field2, COUNT(Counted) AS Count1
FROM dbo.Table1
WHERE Counted = 2
GROUP BY Field1, Field2) q
GROUP BY q.Field1) qHighest
ON qSource.Field1 = qHighest.Field1
AND qSource.Count1 = qHighest.HighestCount
ORDER BY qSource.Field1
答案 2 :(得分:0)
我一直在寻找同样的东西,不喜欢复杂的解决方案,所以我一直在寻找并找到了这个:
https://www.sqlservercentral.com/forums/topic/t-sql-equivalent-to-ms-access-first-function
使用“前 1”
选择 Top 1 SomeColumn 从某个表 订购方式
这真的很好,因为您添加了复杂 ORDER BY 的功能,以准确获得您想要的功能 如果有多个第一