这是我的表结构:
DATE (date)
SOURCE (varchar(50))
COMPANY (varchar(50))
PERSON (varchar(50))
然后我说了4行数据:
2015-11-22 , "AUTO", "COMPANY1", "PERSONAUTO"
2015-12-05 , "AUTO", "COMPANY2", "PERSON2"
2015-11-22 , "CUSTOM", "COMPANY1", "PERSONCUSTOM"
2015-11-23 , "AUTO", "COMPANY3", "PERSON3"
我想创建一个sql查询,只选择日期在2015年11月之内的行,和也选择优先级来源" CUSTOM"超过"自动"如果它存在于公司,否则使用" AUTO"一。所以期望的输出是:
2015-11-22 , "CUSTOM", "COMPANY1", "PERSONCUSTOM"
2015-11-23 , "AUTO", "COMPANY3", "PERSON3"
如果这个方法太难在sql中完成,我可以将所有数据都抓到c#DataTable中并使用linq。如果有人可以为此提供一个例子,那就太好了! (不确定哪个更有效......)
答案 0 :(得分:1)
每个公司只需要一行?然后按公司对结果进行分区,按源排序,然后仅选择每个分区中的顶行。
SELECT Date, Source, Company, Person,
ROW_NUMBER() OVER (PARTITION BY Company
ORDER BY Source DESC) AS rk
FROM MyTable
WHERE MONTH(Date) = 11 AND YEAR(Date) = 2015
AND rk = 1
我应该补充一点,如果你的表很大,你可能想要在日期字段上编制索引。在这种情况下,MONTH()和YEAR()函数不是按日期过滤的最有效方法。最好使用类似的东西:
WHERE Date >= @StartDate AND Date < DATEADD(month, 1, @StartDate)
答案 1 :(得分:0)
也许您可以使用以下查询
Select *
From TABLE_NAME
Where DATE <= '30-11-2015'
Order By COMPANY, SOURCE = 'CUSTOM' DESC