如何跨组选择最高公共值

时间:2018-03-26 14:16:55

标签: sql-server linq

`假设我有一组包含2个字段的数据 - 类型和日期。我有兴趣找到(如果存在)各种类型的最大共同日期。在SQL或LINQ中这样做更容易吗?

鉴于以下数据,结果应为2018-02-01,因为这是所有类型的最大公共日期。它没有这样的日期,因此没有返回数据。

Type, Date
---------
1,2018-03-01
1,2018-02-01
1,2018-01-01

2,2018-02-01
2,2018-05-01
2,2018-01-01

3,2018-01-01
3,2018-03-01
3,2018-02-01

4 个答案:

答案 0 :(得分:3)

您可以使用:

SELECT TOP 1 [Date], COUNT(*) OVER(PARTITION BY Date) AS cnt
FROM tab
ORDER BY cnt DESC, [Date] DESC

<强> DBFiddle Demo

答案 1 :(得分:2)

如果你有无限数量或不确定数量的类型,这将会起作用:

CREATE TABLE #Sample ([Type] int, [DAte] date);
INSERT INTO #Sample
VALUES
(1,'20180301'),
(1,'20180201'),
(1,'20180101'),
(2,'20180201'),
(2,'20180501'),
(2,'20180101'),
(3,'20180101'),
(3,'20180301'),
(3,'20180201');
GO

WITH EntryCount AS(
    SELECT [Type], [Date],
           COUNT(*) OVER (PARTITION By [Date]) AS Entries
    FROM #Sample)
SELECT MAX(Date)
FROM EntryCount EC
WHERE Ec.Entries = (SELECT COUNT(DISTINCT sq.[Type]) FROM #Sample sq);
GO

DROP TABLE #Sample;

不确定它会有多快。

答案 2 :(得分:2)

示例

Select Top 1 [Date]
 from  YourTable
 Group By [Date]
 Order By count([Type]) desc,[Date] desc

<强>返回

2018-02-01

答案 3 :(得分:1)

这不是非常有效,无论你如何切片,因为你必须比较三组。假设您有3种类型,则可以使用自联接。这样的事情。

select MAX(YourDate)
from YourTable yt
join YourTable yt2 on yt2.YourType = 2 and yt.YourDate = yt2.YourDate
join YourTable yt3 on yt3.YourType = 3 and yt.YourDate = yt3.YourDate
where yt.YourType = 1